R语言实现双层级分组排序:period变化时重置月份序列
R按分组重置生成分类连续序号实现方案
需求说明
基于month字段生成连续数值序列,规则如下:
- 相同
month值对应同一个序号 - 当
period字段取值变化时,序列自动重置,从1重新开始计数
示例输入数据:
period <- c("1", "1", "1", "1","0", "0", "0","0") month <- c("Jan2019", "Jan2019", "Jan2019", "Feb2019", "Feb2020", "Mar2020", "Mar2020","Apr2020") df <- data.frame(period, month)
期望输出:
| period | month | results |
|---|---|---|
| 1 | Jan2019 | 1 |
| 1 | Jan2019 | 1 |
| 1 | Jan2019 | 1 |
| 1 | Feb2019 | 2 |
| 0 | Feb2020 | 1 |
| 0 | Mar2020 | 2 |
| 0 | Mar2020 | 2 |
| 0 | Apr2020 | 3 |
可行实现方案
1. dplyr实现(最常用,代码可读性高)
核心逻辑是按period分组后,将组内month按首次出现顺序转为因子,映射为连续整数即可,分组边界会自动重置计数:
library(dplyr) df <- df %>% group_by(period) %>% mutate(results = as.integer(factor(month, levels = unique(month)))) %>% ungroup()
2. data.table实现(适合百万级以上大数据量场景)
library(data.table) setDT(df) df[, results := .GRP, by = .(period, month)][ , results := match(results, unique(results)), by = period ]
3. base R实现(无需加载第三方包)
df$results <- ave( as.integer(factor(df$month, levels = unique(df$month))), df$period, FUN = \(x) match(x, unique(x)) )
之前方案失效原因
之前用cur_group_id配合seq未达到效果,核心是两个问题:
- 没有正确将
period作为最高优先级分组维度,做组内计算的作用域隔离 - 未处理同组内相同
month共享序号的逻辑,逐行生成序列会导致相同month拿到不同序号
内容的提问来源于stack exchange,提问作者Tan Sing Chee
相关产品推荐
相关产品推荐

