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

如何在Base R或dplyr中统计数据框单列的隐含分组累计数?

问题描述

现有数据框myDF由以下代码生成:

myDF <- data.frame(index = c(2,2,4,4,6,6,6))

初始状态如下:

> myDF
  index
1     2
2     2
3     4
4     4
5     6
6     6
7     6

需要为该数据框添加cumGrp列,对相邻相同index值的隐含分组进行累计计数,最终效果如下:

> myDF
  index cumGrp   cumGrp explained
1     2      1   1st grouping of same index numbers (2) adjacent to each other
2     2      1   Same as above
3     4      2   2nd grouping of same index numbers (4) adjacent to each other
4     4      2   Same as above
5     6      3   3rd grouping of same index numbers (6) adjacent to each other
6     6      3   Same as above
7     6      3   Same as above

求简洁的Base R或dplyr实现代码。

解决方案

Base R 实现

用cumsum()和diff()就能快速完成:

myDF$cumGrp <- cumsum(c(TRUE, diff(myDF$index) != 0))

说明

  • diff(myDF$index)计算相邻index的差值,差值不为0就代表切换到了新分组
  • 在开头补一个TRUE,确保第一个元素直接归为第1组
  • cumsum()把逻辑值(TRUE=1,FALSE=0)累加,自动生成连续相同index的分组编号

dplyr 实现

提供两种简洁写法:

方法1:借助data.table的rleid()

rleid()专门用于生成连续相同值的分组ID,配合dplyr使用很便捷:

library(dplyr)
myDF <- myDF %>% 
  mutate(cumGrp = data.table::rleid(index))

方法2:纯dplyr实现

无需额外加载data.table,用lag()和cumsum()组合即可:

library(dplyr)
myDF <- myDF %>% 
  mutate(cumGrp = cumsum(index != lag(index, default = first(index))))

说明

  • lag(index, default = first(index))获取当前元素的前一个index值,第一个元素的默认前值设为自身
  • index != lag(...)判断当前是否切换了分组,生成逻辑向量
  • cumsum()累加逻辑值,得到分组编号

内容的提问来源于stack exchange,提问作者Village.Idyot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:20:22