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

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)

期望输出:

periodmonthresults
1Jan20191
1Jan20191
1Jan20191
1Feb20192
0Feb20201
0Mar20202
0Mar20202
0Apr20203

可行实现方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 20:27:19