在子集化后返回数据框中所有列的值

时间:2014-07-31 17:49:39

标签: r

这是我几天前提出的一个问题的扩展名为"将数据框的子集分配给20个重复和2个处理的列的最小值",关于相同的数据集但略有不同的数据框架。我的数据框df有五列(朱利安日期,治疗,细胞,鲜花,死亡)。有20个复制细胞接受2次处理,并在多个日期记录花和死花。

示例df:

'juliandate' 'cell' 'treatment' 'flowers' 'dead'
260            1       1           5        0
265            1       1           8        2
270            1       1           1        5
260            1       2           1        0
265            1       2           10       2
270            1       2           0        8
260            2       1           3        0
265            2       1           9        5
270            2       1           2        12
260            2       2           2        1
265            2       2           6        2
270            2       2           3        6

我使用以下代码获得与2个治疗中每个细胞的最大死花数相对应的朱利安日期,选择多个日期具有相同死花数的后期朱利安日期给定的细胞和治疗

df[, list(dead=max(dead), julian=max(julian[dead==max(dead)])), by=list(cell.id, treat)]

返回:

'juliandate' 'cell' 'treatment' 'dead'
270           1       1            5
270           1       2            8
270           2       1            12
270           2       2            6

这将返回我正在寻找的内容,但我还想返回与此新子集对应的flower列中的值。

例如:

'juliandate' 'cell' 'treatment' 'flowers 'dead'
270           1       1             1      5
270           1       2             0      8
270           2       1             2      12
270           2       2             3      6

如果没有创建多个子集并将它们合并在一起,是否有一个很好的干净方法?提前谢谢。

2 个答案:

答案 0 :(得分:2)

dplyr适用于data.framedata.table s(至少对于某些操作,但它不会为所有现有的data.table操作提供一种替代)在这种情况下,无论类型如何,它都应该适用于您的数据:

library(dplyr)

df %>%     # data.frame or data.table 
  group_by(cell, treatment) %>%
  filter(dead == max(dead), juliandate == max(juliandate[dead==max(dead)]))

#Source: local data table [4 x 5]
#Groups: cell, treatment
#
#  juliandate cell treatment flowers dead
#1        270    1         1       1    5
#2        270    1         2       0    8
#3        270    2         1       2   12
#4        270    2         2       3    6

答案 1 :(得分:2)

以下是使用data.table的一些变体:

library(data.table)
subset(df, df[, dead == max(dead) & 
                juliandate == max(juliandate[dead == max(dead)]), 
by=list(cell, treatment)]$V1)
#    juliandate cell treatment flowers dead
# 1:        270    1         1       1    5
# 2:        270    1         2       0    8
# 3:        270    2         1       2   12
# 4:        270    2         2       3    6

或者

df[df[, dead == max(dead) &
        juliandate == max(juliandate[dead == max(dead)]), 
by=list(cell, treatment)]$V1]

或者

df[, .SD[dead == max(dead) & 
         juliandate == max(juliandate[dead==max(dead)])], 
by=list(cell, treatment)]

此外,您可以在所有这些解决方案上使用临时变量,以避免对每个组进行两次==矢量扫描,如下所示(此处仅显示在一个变体中):

subset(df, df[, { tmp = dead == max(dead); 
                  tmp & juliandate == max(juliandate[tmp])
                }, 
by=list(cell, treatment)]$V1)