如何在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
相关产品推荐
相关产品推荐

