查找按时间顺序给定的每个组的标签

时间:2019-03-28 22:01:20

标签: r dataframe dplyr data.table

我想根据事件在数据框中创建一个新列(因此,只有event == 1的行在不定期的时间索引t上进行分组。事实是{{ 1}}按顺序而不是按定义的event发生。基本上,我希望每个timerange序列都获得一个不同的event == 1标签。

group

我想获得的内容类似于新列x = c(10, 9 ,8,8,8,5,4,3,3,3,3,3,3,4,5,6,7,8,12) event = c(0,0,1,1,1,0,0,1,1,1,1,1,1,0,0,0,0,0,0) t = 1:length(x) df = data.frame(x, event,t) 。主要的问题是,在我的序列中,我没有预先准备多少个“带有group的子序列”或它们将持续多长时间。

这是我最终希望得到的:

event == 1

1 个答案:

答案 0 :(得分:2)

也许不是很可读...

library("tidyverse")

x = c(10, 9 ,8,8,8,5,4,3,3,3,3,3,3,4,5,6,7,8,12)
event = c(0,0,1,1,1,0,0,1,1,1,1,1,1,0,0,0,0,0,0)
t = 1:length(x)
df = data.frame(x, event,t)

df %>%
  # `cumsum` detects the start of a new event (a switch from 0 to 1)
  mutate(group = event * cumsum((event == 1 & lag(event, default = 0) == 0)))
#>     x event  t group
#> 1  10     0  1     0
#> 2   9     0  2     0
#> 3   8     1  3     1
#> 4   8     1  4     1
#> 5   8     1  5     1
#> 6   5     0  6     0
#> 7   4     0  7     0
#> 8   3     1  8     2
#> 9   3     1  9     2
#> 10  3     1 10     2
#> 11  3     1 11     2
#> 12  3     1 12     2
#> 13  3     1 13     2
#> 14  4     0 14     0
#> 15  5     0 15     0
#> 16  6     0 16     0
#> 17  7     0 17     0
#> 18  8     0 18     0
#> 19 12     0 19     0

reprex package(v0.2.1)于2019-03-28创建