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

如何修改dplyr代码实现dataframe连续数值行的子集化与分组?

解决DataFrame连续序列分组子集化问题

原数据与需求

给定如下DataFrame:

df <- data.frame(num = c(1, 2, 4, 5, 7, 9, 10), value = c('a', 'b', 'c', 'd', 'e', 'f', 'g'))

需要提取所有属于连续无中断数字序列的行,即保留像1-2、4-5、9-10这类长度≥2的连续组,排除单独的7,预期输出:

num value
1     1     a
2     2     b
3     4     c
4     5     d
5     9     f
6    10     g

原代码的问题

你尝试用差值过滤的代码逻辑有误,导致连续组的起始行(如4、9)被排除:

df_subset = df %>% 
  mutate(difference = num - lag(num, default = first(num))) %>%
  filter(difference ==1 | row_number() ==1)

错误输出:

num value
1     1     a
2     2     b
3     5     d
4    10     g

原因是连续组的起始行和前一行的差值不等于1,被filter条件排除,但这些行本身是连续组的一部分,不能被过滤。

正确解决方案

核心思路是先给每个连续序列打上唯一分组标识,再过滤掉仅含单个元素的分组:

library(dplyr)

df_subset <- df %>%
  # 生成分组标识:连续递增1的序列,num与行号的差值固定
  mutate(group_id = num - row_number()) %>%
  # 按分组标识聚合,只保留组内元素数量≥2的组
  group_by(group_id) %>%
  filter(n() >= 2) %>%
  # 取消分组并移除辅助列
  ungroup() %>%
  select(-group_id)

print(df_subset)

逻辑说明

  • num - row_number():对于连续递增1的序列,每一行的num比前一行大1,行号也同步+1,因此这个差值会保持恒定;而单独的数字(如7),其差值和前后组都不同,会形成独立分组。
  • 通过filter(n() >= 2)筛选出包含至少2个元素的分组,就能得到所有连续序列的完整行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 03:04:58