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

