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

R语言如何筛选grp非连续递增1的完整Sequ分组数据

问题说明

现有包含分组变量Sequ、计数变量grp的数据框,示例数据构造代码如下:

df <- data.frame(
  Sequ = c(1,1,2,2,2,2,3,3,3,4,4,4,4),
  grp = c(1,2,
          1,3,4,5,
          1,2,3,
          1,2,4,5)
)

需求为筛选grp序列存在相邻项增量大于1(即非逐次加1连续编号)的所有Sequ分组对应的完整行数据。
原有dplyr代码仅能定位到序列断点所在行,无法返回对应Sequ分组的全部数据,原代码及运行结果如下:

df %>%
  group_by(Sequ) %>%
  filter(lead(grp) - grp > 1)

# A tibble: 2 × 2
# Groups:   Sequ [2]
   Sequ   grp
  <dbl> <dbl>
1     2     1
2     4     2

期望输出为所有存在编号断点的Sequ分组的全部行,结果如下:

Sequ grp
1     2   1
2     2   3
3     2   4
4     2   5
5     4   1
6     4   2
7     4   4
8     4   5
实现方法

原有代码的问题是filter中使用的是行级判断,仅会保留满足相邻差值大于1的单行。只要把判断逻辑改为分组级判断:只要组内存在任意一处相邻grp差值大于1,就保留该组全部行即可。
调整后的代码如下:

library(dplyr)

df %>%
  group_by(Sequ) %>%
  filter(any(lead(grp) - grp > 1, na.rm = TRUE)) %>%
  ungroup()

关键逻辑说明:

  • lead(grp) - grp > 1:逐行计算当前行与下一行grp的差值是否大于1,每个分组最后一行无后续值,会返回NA
  • any(..., na.rm = TRUE):判断当前分组内是否存在至少一处差值大于1的情况,na.rm = TRUE用于排除最后一行生成的NA对判断结果的干扰
  • 最终filter会保留所有满足判断条件的分组的全部行,运行后即可得到期望输出。

内容的提问来源于stack exchange,提问作者Chris Ruehlemann

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 23:09:15