单独的aggregate()循环条件序列

时间:2016-09-15 09:42:44

标签: r sequence

数据框包含几个条件的重复序列,对于列'条件'中条件序列的每次重复,我试图获取相邻列'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

但是如何进一步扩展这个以分别处理每个条件实例?

示例已简化,实际数据有局限性:

  • 数据中的条件顺序可以是随机的
  • 条件序列大小不固定

1 个答案:

答案 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。因此,最好保持这种方式。