这是我几天前提出的一个问题的扩展名为"将数据框的子集分配给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
如果没有创建多个子集并将它们合并在一起,是否有一个很好的干净方法?提前谢谢。
答案 0 :(得分:2)
dplyr
适用于data.frame
和data.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)