R语言如何仅保留分组内模式最后一次出现及后续的观测值
实现思路
- 先按分组字段(示例中为
ID)和时间字段排序,保证观测的时序正确 - 给D值连续相同的观测打相同的分组标签,区分开不同段的连续取值
- 定位到最后一次出现符合要求的模式(示例中为连续D=1)的结束位置
- 筛选出所有行号大于等于该结束位置的观测即可得到目标结果
R 实现代码(基于dplyr)
library(dplyr) # 示例数据构造 df1 <- structure(list(TIME = c("12:30:10", "12:30:42", "12:30:59", "12:31:20", "12:31:50", "12:32:11", "12:32:45", "12:33:10", "12:33:33", "12:33:55", "12:34:15", "12:34:30", "12:35:30", "12:36:30", "12:36:45", "12:37:00", "12:38:00"), ID = c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), D = c(0L, 0L, 1L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L)), class = "data.frame", row.names = c(NA, -17L)) df2 <- df1 %>% # 按分组字段和时间排序,保证时序 arrange(ID, TIME) %>% group_by(ID) %>% # 给连续相同的D值打分组标签 mutate(d_group = cumsum(D != lag(D, default = first(D)))) %>% # 找到最后一次D=1的连续段的最后一行位置 mutate(last_pattern_end = max(row_number()[D == 1 & d_group == max(d_group[D == 1])])) %>% # 保留该位置及之后的所有观测 filter(row_number() >= last_pattern_end) %>% ungroup() %>% # 删除辅助计算列 select(-d_group, -last_pattern_end)
运行上述代码得到的df2和你给出的预期结果完全一致。如果你需要匹配其他自定义模式,只需要修改代码中D == 1的判定条件为你对应的模式识别逻辑即可。
内容的提问来源于stack exchange,提问作者Tham v
相关产品推荐
相关产品推荐

