我想根据事件在数据框中创建一个新列(因此,只有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
答案 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创建