这是Ronak Shah's1 答案的故意教学版本,以不雅但逐步的方式展示如何使用来自rle 的运行长度来捕获行索引以用于识别零运行和以下非运行-零events
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
data <- tibble(ID=rep(c(1:2), each= 9), time = rep(1:9, 2), event = c(1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,0,1,0))
runs <- rle(data$event)
runs <- tibble(runs$lengths, runs$values)
colnames(runs) <- c("lengths", "values")
sequences <- sequences <- tibble(lengths = runs$lengths, values = runs$values) %>% mutate(indices = cumsum(runs$lengths))
post_zero <- sequences %>% filter(values == 0)
result <- left_join(sequences, post_zero, by = "indices") %>% select(1:3) %>% filter(values.x == 1)
colnames(result) <- c("lengths", "runs", "indices")
data[result$indices,]
#> # A tibble: 4 x 3
#> ID time event
#> <int> <int> <dbl>
#> 1 1 3 1
#> 2 2 2 1
#> 3 2 6 1
#> 4 2 8 1
由reprex package (v0.3.0) 于 2019 年 12 月 16 日创建