如何为R语言数据框的每个分组生成长度为n的重复编号?
为R语言数据集的分组添加重复长度为n的编号
原始数据集定义
test <- data.frame("group" = c(rep("AA",5),rep("BB",3)), "value" = 12:19)
原始数据输出:
test #> group value #> 1 AA 12 #> 2 AA 13 #> 3 AA 14 #> 4 AA 15 #> 5 AA 16 #> 6 BB 17 #> 7 BB 18 #> 8 BB 19
需求说明
为每个分组添加从1开始、重复长度为n(示例中n=3)的编号,生成group_n列,最终效果如下:
#> group value group_n #> 1 AA 12 AA_1 #> 2 AA 13 AA_1 #> 3 AA 14 AA_1 #> 4 AA 15 AA_2 #> 5 AA 16 AA_2 #> 6 BB 17 BB_1 #> 7 BB 18 BB_1 #> 8 BB 19 BB_1
解决方案
方法1:基础R实现(无需额外包)
使用ave()函数按分组计算序号,再拼接字符串:
n <- 3 test$group_n <- paste0(test$group, "_", ave(seq_along(test$group), test$group, FUN = function(x) ceiling(x/n))) # 查看结果 test
逻辑说明:seq_along()生成每行的全局索引,ave()按group分组处理,ceiling(x/n)将每组内的索引按每n个一组向上取整,得到连续重复的序号,最后用paste0()拼接成分组名_序号的格式。
方法2:tidyverse(dplyr)实现
如果习惯使用tidyverse语法,用分组后生成行号再计算序号:
library(dplyr) n <- 3 test <- test %>% group_by(group) %>% mutate(group_n = paste0(group, "_", ceiling(row_number()/n))) %>% ungroup() # 查看结果 test
逻辑说明:group_by(group)按分组拆分数据,row_number()生成每组内的行号,ceiling(row_number()/n)计算每组内的重复序号,最后拼接字符串并取消分组。
内容的提问来源于stack exchange,提问作者ZainNST
相关产品推荐
相关产品推荐

