R语言实现:指定列值非唯一时创建分组连续序号新列
问题说明
现有两列数据框df,包含x、y两列,需要新增列z,在x的每个分组内按原始行顺序从1开始连续编号,测试数据构造代码如下:
x <- c("1", "1", "1", "1", "2", "2", "2", "3", "3", "3", "4", "4", "5", "6", "6", "6") y <- c("Y", "Y", "Y", "Y", "N", "N", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "N", "Y", "Y") df <- data.frame(x, y)
期望输出效果:
x y z 1 1 Y 1 2 1 Y 2 3 1 Y 3 4 1 Y 4 5 2 N 1 6 2 N 2 7 2 Y 3 8 3 Y 1 9 3 Y 2 10 3 Y 3 11 4 Y 1 12 4 Y 2 13 5 Y 1 14 6 N 1 15 6 Y 2 16 6 Y 3
实现方案
以下提供三种常用实现方式,输出结果完全匹配需求:
- 基础R方案(无需安装加载第三方包)
直接用ave()函数按x分组生成序列即可:
df$z <- ave(seq_len(nrow(df)), df$x, FUN = seq_along)
- dplyr方案(适合tidyverse工作流)
分组后用row_number()生成组内行号:
library(dplyr) df <- df %>% group_by(x) %>% mutate(z = row_number()) %>% ungroup()
- data.table方案(适合大数据量场景,运行速度快)
按x分组后直接赋值序列:
library(data.table) setDT(df)[, z := seq_len(.N), by = x]
注意:所有方案都保留数据原始行顺序,不会调整行的排列,序号完全按原始数据的出现顺序生成。
内容的提问来源于stack exchange,提问作者zerberus
相关产品推荐
相关产品推荐

