我的数据框看起来像这样(使用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的长格式,如果这样可以让事情变得更容易吗?
你对我有什么建议吗?
答案 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()
计算每个子组的这两行之间的差异。