R语言如何基于gender列生成带21段、分性别重置的唯一标识符
生成规则匹配的唯一标识符列
规则对齐说明
结合给出的示例输出,实际计数逻辑为:按gender的取值分组,每个gender类别从0001开始按行出现顺序累计计数,不因中途插入其他gender值重置序号,最终拼接为「gender取值 + 固定值21 + 4位补零顺序号」的格式。
如果按照相邻行gender变化就重置序号的逻辑,示例中第6行的F类数据会重新从0001开始编号,和给定输出F210004不匹配,这点需要注意区分。
方案1:dplyr 实现
适配5000行规模的结构化数据处理,代码可读性高:
library(dplyr) df <- df %>% group_by(gender) %>% mutate(id = paste0(gender, "21", sprintf("%04d", row_number()))) %>% ungroup()
代码逻辑:
group_by(gender)按gender值拆分数据组row_number()在每个组内按原始行顺序生成从1开始的连续序号sprintf("%04d", ...)将序号补零为4位长度(如1转成0001)- 拼接完成后用
ungroup()解除分组状态,避免影响后续分析
方案2:Base R 原生实现
无需加载额外包,适配轻量化场景:
df$id <- paste0( df$gender, "21", sprintf("%04d", ave(seq_len(nrow(df)), df$gender, FUN = seq_along)) )
代码逻辑:
ave()函数按gender分组,为每组生成从1开始的连续序号- 后续拼接、补零逻辑和dplyr方案完全一致
输出验证
以上两个方案生成的结果和给出的期望输出完全一致:
| name | gender | id |
|---|---|---|
| A | F | F210001 |
| B | F | F210002 |
| C | F | F210003 |
| D | M | M210001 |
| E | M | M210002 |
| F | F | F210004 |
| G | M | M210003 |
| H | F | F210005 |
| I | F | F210006 |
内容的提问来源于stack exchange,提问作者L R
相关产品推荐
相关产品推荐

