R:如何根据多列上的因子水平减去值?

时间:2017-09-05 14:11:39

标签: r plyr reshape

我的数据框看起来像这样(使用reshape2 :: cast和merge):

time days treatment extrafactor1 extrafactor2 extrafactor3 animal1  animal2 animal3
10  83  control B   water   2   2   67  40
10  83  control B   water   3   50  67  39
10  83  control A   water   3   22  80  63
10  83  control A   water   2   40  40  100
10  83  treated A   water   3   40  69  92
10  83  treated A   water   1   64  56  6
10  83  treated A   water   2   90  67  52
10  83  treated B   water   2   14  36  77
10  83  treated B   water   3   41  83  55
10  83  treated B   water   1   66  31  51
11  86  control B   water   1   99  100 10
11  86  control B   water   2   23  27  22
11  86  control A   water   3   57  10  65
11  86  control A   water   1   60  2   49
11  86  control A   water   2   23  14  44
11  86  control B   water   3   97  45  20
11  86  treated B   water   2   71  15  24
11  86  treated B   water   3   49  55  63
11  86  treated A   water   3   54  88  27

我想从处理过的样品中减去对照样品的不同动物的值。当然,减法应该发生在其他因素的水平匹配的地方,所以动物1的值是" 11_86_treated_A_water_3"应该减少动物1值" 11_86_control_A_water_3",并为每只动物做这个。我一直在和plyr一起尝试一些事情,比如

df2 <- ddply(df, .(time,days,treatment,extrafactor1,extrafactor2,extrafactor3), transform, animal1 = animal1-animal1[treatment=="control"])

但它给了我很多NAs,我确信缺少足够的信息来充分执行我想要的东西。实际上有100只动物。

我的尝试是从这里改编的,但输入变量较少,列数较少:Easiest way to subtract associated with one factor level from values associated with all other factor levels 在这里:R ddply with multiple variables

还可以等到将表重新整形为ggplot的长格式,如果这样可以让事情变得更容易吗?

你对我有什么建议吗?

1 个答案:

答案 0 :(得分:1)

不是最优雅的,但您可以创建一个名为group_string的新列,它是所有不同因素的连接字符串,就像您在示例中提到的那样。但无论是“控制”还是“对待”都是最后一个论点。例如,而不是

"11_86_treated_A_water_3""11_86_control_A_water_3"

你会有

"11_86_A_water_3_treated""11_86_A_water_3_control"

然后你可以在没有处理/控制子字符串的情况下运行所有​​唯一字符串的循环,例如:一个唯一字符串"11_86_A_water_3_",其中每个字符串都会从group_string中已“处理”的行中group_string中的“控件”行中减去。

编辑: 好的,只是有另一个想法。除了治疗(时间,天数,extrafactor1,extrafactor2,extrafactor3)之外的所有因素分组,这应该为每个子组留下两行。然后使用diff()计算每个子组的这两行之间的差异。