基于其他列在分组内为唯一值分配编号(R语言)
问题分析与解决方案
你的代码错误点
- 排序操作未生效:
my_data[order(my_data$group_1, my_data$var_1),]仅生成临时排序后的数据集,但未将结果赋值给变量,后续逻辑完全没用到这个排序结果。 - 错误使用
cur_group_id():这个函数是给整个分组分配ID,而非针对分组内var_1的唯一值分配标识,导致同一分组下所有行的ID完全相同,不符合需求。
正确实现代码
使用dplyr的dense_rank()函数,它会在分组内为var_1的相同值分配相同排名,不同值按升序生成连续排名,再拼接成gX格式的标识:
library(dplyr) my_data %>% group_by(group_1) %>% mutate(var_2 = paste0("g", dense_rank(var_1))) %>% ungroup() # 可选,取消分组状态,方便后续操作
执行后输出结果:
# A tibble: 6 × 4 id group_1 var_1 var_2 <dbl> <chr> <dbl> <chr> 1 1 a 12 g1 2 2 a 32 g2 3 3 b 14 g1 4 4 b 17 g2 5 5 b 14 g1 6 6 b 18 g3
如果需要先对分组内的var_1进行升序排序,再生成标识(dense_rank本身已按值升序处理,此步骤可选),可以添加arrange操作:
my_data %>% group_by(group_1) %>% arrange(var_1, .by_group = TRUE) %>% mutate(var_2 = paste0("g", dense_rank(var_1))) %>% ungroup()
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

