【发布时间】:2020-06-05 10:22:05
【问题描述】:
我分析了一个实验数据集,并想计算每个变量的效应大小。我的数据框由 8 个处理 t(= 行)的多个变量(= 列)组成,t1 - t4 分别是 t5 - t8 的控制(t1 控制 t5,t2 控制 t6,...)。原始数据集要大得多,所以我想解决以下两个任务::
我想计算一个变量的每个 t5 - t8 的对数(治疗/对照),例如t5 = log(t5/t1) 的影响大小,t6 = log(t6/t2) 的影响大小,...。结果列的名称应该是 variablename_effect 并且新列将只有 4 行而不是 8 行。
最棘手的部分是,我需要在我的代码中实现特定行的组合,以便为每个处理使用正确的控件。我想在一个代码中计算所有变量的效果大小,因此创建多个具有正确名称的新列 (variablename_effect)。
我更愿意在 dplyr 或 base R 中解决问题以保持简单。
到目前为止,我发现的唯一相关问题是/r-dplyr-mutate-refer-new-column-itself(显示多个if else() 的组合)。我将非常感谢解决方案、类似问题的链接或我应该在 cast 中使用哪些包,这在 dplyr / base R 中是不可能的!
样本数据:
df <- data.frame("treatment" = c(1:8), "Var1" = c(9:16), "Var2" = c(17:24))
编辑:这是我希望作为输出收到的 df_effect,感谢@Martin_Gal 的提示!
df_effect <- data.frame("treatment" = c(5:8), "Var1_effect" = c(log(13/9), log(14/10), log(15/11), log(16/12)), "Var2_effect" = c(log(21/17), log(22/18), log(23/19), log(24/20)))
到目前为止我的想法:
- 用于计算效果大小:
mutate() 和函数:
# 1st option:
for (i in 5:8) {
dt_effect <- df %>%
mutate(Var1_effect = log(df[i, "Var1"]/df[i - 4, "Var1"]))
}
#2nd option:
for (i in 5:8){
dt_effect <- df %>%
mutate(Var1_effect = log(df[treatment == i , "Var1"]/df[treatment == i - 4 , "Var1"]))
}
问题:每行都返回 i = 8 的结果!
mutate() 和 ifelse():
df_effect <- df %>%
mutate(Var1_effect = ifelse(treatment >= 5, log(df[, "Var1"]/df[ , "Var1"]), NA))
似乎工作,但到目前为止我无法实现为控件选择哪一行,因此它返回 NA 为 t1 - t4(正确)和 0 为 t5 - t8 (数学上正确,因为我计算 log(t5/ t5), ...但不是我想要的)。
也许我应该使用 summarise() 而不是 mutate() 因为我创建的行数比原始数据帧中的少?
- 让这同时适用于每个变量
我唯一的想法是在一秒钟内为函数索引列并使用 paste() 创建新的列名,但我不知道该怎么做...
【问题讨论】:
-
基于您的示例 data.frame:您能否展示您的预期输出的样子?
-
如果您为类型(=处理或控制)和索引(1:4)添加指标变量,然后将数据框与自身连接起来,以便处理和相应的控制在同一行,它会罢工我说你的问题会简单得多。正如@MartinGal 所说,您的预期输出的一些想法会有所帮助。
-
感谢@MartinGal 的提示 - 我添加了预期的输出!
-
@Limey 我也想到了这一点,但我认为它确实会使我的数据变得凌乱。所有 t1 - t8 都是不同的实验设置,这取决于我正在查看的效果,哪些是对照,哪些是治疗。这就是为什么我可以为上面提到的这个效果这样做,但必须为我看到的每个效果创建一个新的 data.frames(会工作,但感觉有点像作弊)
-
我评论的初稿以“你的问题是你的数据不整洁”开头!但后来我重读了您的帖子,发现您的数据可能是整洁的。我们处于哲学转移的危险之中。大多数时候,“控制”只是另一种处理方式,所以你的格式是整洁的,而我的建议不是。但是当你想计算一个效果时,我认为将“Control”视为“Not-Treatment”是合理的。毕竟,当你展示你的“效果”时,你会删除“控制”行,不是吗?它们的影响都为零。如果整洁让我的生活变得困难,我就会变得凌乱!