You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言如何仅保留分组内模式最后一次出现及后续的观测值

实现思路

  1. 先按分组字段(示例中为ID)和时间字段排序,保证观测的时序正确
  2. 给D值连续相同的观测打相同的分组标签,区分开不同段的连续取值
  3. 定位到最后一次出现符合要求的模式(示例中为连续D=1)的结束位置
  4. 筛选出所有行号大于等于该结束位置的观测即可得到目标结果

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 12:36:02