如何为重复分组生成组内连续计数(R语言tibble场景)
问题:为分组生成独立连续计数列
现有如下tibble数据框:
df <- tibble( group = c("A", "A", "A", "B", "A", "A", "A", "C", "B", "B", "C", "A"), count = c(1,1,1,2,3,3,3,4,5,5,6,7) )
其中group列存在重复的连续分组序列(比如第1-3行是A的首次连续出现,第5-7行是A的第二次连续出现),需要生成individual_running_count列,记录每个分组自身连续出现的批次编号,期望输出如下:
df <- tibble( group = c("A", "A", "A", "B", "A", "A", "A", "C", "B", "B", "C", "A"), count = c(1,1,1,2,3,3,3,4,5,5,6,7), individual_running_count = c(1,1,1,1,2,2,2,1,2,2,2,3) )
解决方案
使用tidyverse工具链可以实现需求,核心思路是先识别连续相同分组的区块,再对每个分组的区块进行编号:
library(tidyverse) # 处理数据生成目标列 df <- df %>% # 标记连续相同group的区块:当前行group与上一行不同时,区块编号递增 mutate(block = cumsum(group != lag(group, default = first(group)))) %>% # 按group分组,对每个group的区块进行连续编号 group_by(group) %>% mutate(individual_running_count = dense_rank(block)) %>% ungroup() %>% # 可选:移除临时生成的block列 select(-block)
原理说明
- 识别连续区块:通过
cumsum(group != lag(group, default = first(group)))生成block列,每次group发生变化时,区块编号自动+1,以此将连续相同的group归为同一个区块。 - 生成分组独立计数:按
group分组后,用dense_rank(block)对每个分组内的区块进行排序,得到该分组每次连续出现的批次编号,也就是目标列individual_running_count。
内容的提问来源于stack exchange,提问作者user25035369
相关产品推荐
相关产品推荐

