数据框包含几个条件的重复序列,对于列'条件'中条件序列的每次重复,我试图获取相邻列'time_ms'中相应值的最大值:
数据
> data.frame( time_ms=sample(20:40,12), condition=replicate(1,c('cond_one','cond_one','cond2','cond2','cond_three','cond_three')) )
time_ms condition
1 22 cond_one
2 38 cond_one
3 26 cond2
4 23 cond2
5 35 cond_three
6 39 cond_three
7 32 cond_one
8 27 cond_one
9 30 cond2
10 34 cond2
11 20 cond_three
12 37 cond_three
理想情况下,所需结果应仅包含每个序列的最大值一次(唯一值仅用于进一步计算):
time_ms condition max_time
1 22 cond_one
2 38 cond_one 38
3 26 cond2 26
4 23 cond2
5 35 cond_three
6 39 cond_three 39
7 32 cond_one 32
8 27 cond_one
9 30 cond2
10 34 cond2 34
11 20 cond_three
12 37 cond_three 37
简单的aggregate()
已关闭:
> aggregate(.~condition, data=mydata, max)
condition time_ms
1 cond_one 38
2 cond_three 31
3 cond2 39
但是如何进一步扩展这个以分别处理每个条件实例?
示例已简化,实际数据有局限性:
答案 0 :(得分:2)
我们可以使用data.table
执行此操作。将'data.frame'转换为'data.table'(setDT(mydata)
),按'条件'的run-length-id分组,得到最大值的行索引(.I
) time_ms',将其提取为列($V1
),将其用作'i',并指定(:=
)'time_ms'的相应值以创建新列'max_time'
library(data.table)
i1 <- setDT(mydata)[, .I[which.max(time_ms)], by = rleid(condition)]$V1
mydata[i1, max_time := time_ms]
# time_ms condition max_time
# 1: 22 cond_one NA
# 2: 38 cond_one 38
# 3: 26 cond2 26
# 4: 23 cond2 NA
# 5: 35 cond_three NA
# 6: 39 cond_three 39
# 7: 32 cond_one 32
# 8: 27 cond_one NA
# 9: 30 cond2 NA
#10: 34 cond2 34
#11: 20 cond_three NA
#12: 37 cond_three 37
注意:这将为缺失值而不是空白(""
)创建NA。通过将其更改为""
,它还会将列的class
更改为character
。因此,最好保持这种方式。