为20个重复和2个处理的列的最小值子集数据帧

时间:2014-07-28 22:19:52

标签: r

我有一个包含4列的数据框(朱利安日期,治疗,细胞,花)。有20个复制细胞接受2次治疗。我想将最小朱利安日期与每个处理中每个细胞记录的最大花数相对应。

示例df:

Julian date  treatment  cell  flowers
256           1         1      2
261           1         1      3
267           1         1      3 
256           1         2      3
261           1         2      8
267           1         2      6
256           2         1      2
261           2         1      4
267           2         1      6
256           2         2      5
261           2         2      9
267           2         2      9

子集将返回:

Julian date  treatment  cell  flowers
261            1         1     3
261            1         2     8
267            2         1     6
261            2         2     9

我能够通过首先通过处理分割数据帧,然后使用ddply通过细胞复制来分配最大花数来实现这个子集:

ddply(df,'cell', subset, flowers==max(flowers))

然后我将每个治疗的数据框合并在一起。问题是我有多个具有相同花数的朱利安日期。从这里我无法弄清楚如何通过单元格和处理(以消除相等的最大花卉总数)将该数据框子集为最小朱利安日期,同时还在最终数据框中返回相应的花数。除了使用括号表示法和减号之外的手动删除行。

我正在使用:

aggregate(julian~cell+treatment, data=, min)

这有效,但不会返回花数。

基本上,我正在寻找一种简洁明了的方法来使用括号表示法或子集()来返回一个数据框,其中最小的朱利安日期对应于每个治疗中我的20个细胞的最大花数,包括花柱。理想情况下,我没有采用我一直在使用的迂回方式。希望有道理!感谢任何人提供的任何帮助。

1 个答案:

答案 0 :(得分:2)

我更喜欢data.table这些操作,但我确信某人有一个非常好的ddply解决方案。

> df = data.table(df)
> df[, .SD[which.max(flowers)], by=list(treatment, cell)]
   treatment cell JulianDate flowers
1:         1    1        261       3
2:         1    2        261       8
3:         2    1        267       6
4:         2    2        261       9

感兴趣的还有tapplyby函数:

tapply(df$flowers, list(df$treatment, df$cell), max)

by(df, list(df$treatment, df$cell), function(x) x[which.max(x$flowers),])