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

如何使用dplyr为分组内的类别添加连续数字型组标签

给分组内的类别添加连续序号(group_no)

嘿,这个需求用dplyr就能轻松搞定!我给你两种常用的实现方式,你可以根据实际需求选择:

方案1:按name的字符顺序生成序号

在你现有的代码基础上,只需要在分组后加一行mutate(),用dense_rank()函数就能生成连续的组标签——它会给每个id分组内的相同name分配同一个序号,而且序号是连续不跳号的:

library(dplyr)
set.seed(1)
df <- data.frame(id = sample(c('a','b'), 20, T), 
                 name = sample(c('N1', 'N2', 'N3'), 20, T), 
                 val = runif(20)) %>% 
  group_by(id) %>% 
  arrange(id, name) %>%
  mutate(group_no = dense_rank(name)) # 新增这一行生成序号

运行后得到的结果示例(截取前8行):

# A tibble: 20 × 4
# Groups:   id [2]
   id    name   val group_no
   <chr> <chr> <dbl>    <int>
 1 a     N1    0.372        1
 2 a     N1    0.908        1
 3 a     N1    0.945        1
 4 a     N2    0.655        2
 5 a     N2    0.697        2
 6 a     N2    0.899        2
 7 a     N3    0.266        3
 8 a     N3    0.380        3
# … with 12 more rows

方案2:按name在分组内首次出现的顺序生成序号

如果你希望序号按照name在每个id分组里第一次出现的顺序来分配(而不是字符顺序),可以用factor()结合unique()来指定层级:

library(dplyr)
set.seed(1)
df <- data.frame(id = sample(c('a','b'), 20, T), 
                 name = sample(c('N1', 'N2', 'N3'), 20, T), 
                 val = runif(20)) %>% 
  group_by(id) %>% 
  mutate(group_no = as.integer(factor(name, levels = unique(name)))) %>%
  arrange(id, name) # 按需调整排序

小提示

  • 因为你已经用group_by(id)做了分组,所以mutate()里的函数会自动在每个id分组内独立计算,不用额外处理跨组的问题。
  • dense_rank()是处理这种类别编号的常用工具,它和rank()的区别是不会因为相同值而产生跳号,完全符合你要的连续数字标签需求。

内容的提问来源于stack exchange,提问作者user3375672

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:45:32