【问题标题】:Sum preceding rows once condition met in R一旦在 R 中满足条件,就对前面的行求和
【发布时间】:2020-03-09 20:38:57
【问题描述】:

我正在寻找一种解决方案,以便在特定列中满足特定条件后对总行数求和。

简化样本数据:

  rbind( c('Group A', "eventcode.1", "10:00"),
                 c('Group A', "eventcode.3", "09:59"),
                 c('Group B', "eventcode.4", "09:57"),
                 c('Group A', "eventcode.6", "09:56"),
                 c('Group B', "eventcode.4", "09:52"),
                 c('Group A', "eventcode.4", "09:51"),
                 c('Group A', "eventcode.9", "09:48"),
                 c('Group A', "eventcode.1", "09:46"),
                 c('Group A', "eventcode.3", "09:45"),
                 c('Group B', "eventcode.4", "09:41"),
                 c('Group B', "eventcode.8", "09:40"),
                 c('Group B', "eventcode.4", "09:37"),
                 c('Group B', "eventcode.1", "09:33"),
                 c('Group B', "eventcode.2", "09:31"),
                 c('Group B', "eventcode.3", "09:30"),
                 c('Group A', "eventcode.5", "09:28"),
                 c('Group A', "eventcode.6", "09:28"),
                 c('Group B', "eventcode.7", "09:27"),
                 c('Group B', "eventcode.2", "09:26"),
                 c('Group A', "eventcode.9", "09:26"),
                 c('Group B', "eventcode.11", "09:24"),
                 c('Group A', "eventcode.7", "09:20"),
                 c('Group A', "eventcode.1", "09:17"),
                 c('Group A', "eventcode.2", "09:15"),
                 c('Group B', "eventcode.4", "09:12"),
                 c('Group B', "eventcode.4", "09:08")) %>%
  as.data.frame() -> temp.data 

colnames(temp.data) = c('Group', 'Event', "Time")

这是一组精简的数据(原始数据将有 40 多列与事件相关的数据),但重要的是要知道每个数据集中只有两种类型的组,并且这些组记录了操作分配有特定代码的事件。每当触发特定事件代码时,我想识别该行并创建一个新变量,该变量将导致事件的行数相加(按每个组 A/B 分组),只要组之间没有中断以及正在采取的行动。触发它的事件代码是“eventcode.1”。然后,在之前的那些行中,我想对特定事件代码 (eventcode.4) 的发生和完成记录事件的组导致 eventcode.1 的事件总时间相加。

即,

row 1 - Group A - would have a value of 0, eventcode.4 count of 0, and time count of 0 seconds
row 8 - Group A - would have a value of 2, eventcode.4 count of 1, and time count of 5 seconds
row 13 - Group B - would have a value of 3, eventcode.4 count of 2, and time count of 8 seconds
row 23 - Group A - would have a value of 1, , eventcode.4 count of 0, and time count of 3 seconds

【问题讨论】:

  • valuetimecount 是如何计算的?
  • @RonakShah 它是在前面的总行中发生的 eventcode.4 的总和,以及以秒为单位的总时间差(时间是倒计时,所以从技术上讲,每当注册 eventcode.1 时,它是最短时间,最长时间是 A/B 组记录的第一个事件 - 所以在第 8 行的输出中,它是第 8 行和第 6 行之间的时间差,即 9:51 到 9: 46 或 5 秒。)

标签: r dplyr


【解决方案1】:

一种方法(使用dplyrlubridate 进行时间转换):

temp.data %>%
   mutate(rn = row_number()) %>%
   mutate(brk1 = lag(V2, 1) == 'eventcode.1',
          brk2 = lag(V1, 1) != V1
         ) %>%
   mutate(grp = cumsum(
                   (1L * coalesce(brk1, F)) + 
                   (1L * coalesce(brk2, F)))
          ) %>%
   group_by(grp) %>%
   filter(last(V2) == 'eventcode.1') %>%
   summarize(
      row = last(rn),
      group = first(V1),
      value = n() - 1,
      cnt = sum(if_else(V2 == 'eventcode.4', 1, 0)),
      tmct = seconds(ms(first(V3))) - seconds(ms(last(V3)))
   ) %>%
   select(-grp);

产生:

# A tibble: 4 x 5
    row group   value   cnt tmct    
  <int> <fct>   <dbl> <dbl> <Period>
1     1 Group A     0     0 0S      
2     8 Group A     2     1 5S      
3    13 Group B     3     2 8S      
4    23 Group A     1     0 3S      

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-18
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    相关资源
    最近更新 更多