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

R语言按id分组筛选出现连续两个yes后所有行的实现问题

R实现按id分组保留首次连续两个yes之后的所有记录

需求说明

对按id分组的数据集进行过滤,仅保留每个id分组中第一次观测到连续两个"yes"值之后的所有记录(包含这两个连续yes本身)。

示例构造数据

DT<-data.frame(id=c(1,1,1,2,2,2,2,3,3,3,3,3,3,3),
type=c("yes","yes","no","no","yes","yes","no","no","yes","no","yes","yes","no","yes"))

预期输出结果

id type
   1  yes
   1  yes
   1   no
   2  yes
   2  yes
   2   no
   3  yes
   3  yes
   3   no
   3  yes

正确实现代码(dplyr)

library(dplyr)

DT %>%
  group_by(id) %>%
  # 标记当前行和上一行是否为连续yes
  mutate(consec_yes = type == "yes" & lag(type, default = "") == "yes",
         # 计算首次连续yes对应的保留起始行号
         start_row = which(consec_yes)[1] - 1) %>%
  # 过滤无连续yes的分组,保留起始行及之后的所有记录
  filter(!is.na(start_row), row_number() >= start_row) %>%
  # 清理辅助列输出结果
  select(id, type) %>%
  ungroup()

逻辑说明

  1. 按id分组后每个组独立计算规则
  2. lag(type, default = "")取当前行的上一行type值,避免首行出现NA导致判断错误
  3. 首次出现consec_yes=TRUE的行是连续两个yes的第二行,往前推1行就是连续两个yes的第一行,作为保留记录的起始位置
  4. 过滤掉不存在连续yes的分组,仅保留每个组起始位置及之后的所有行即可得到目标结果

内容的提问来源于stack exchange,提问作者Yebelay Berehan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:39:00