R语言将混合类型ID重编码为有序数值ID的实现方法
R实现id变量重编码方案
核心逻辑:先提取id列开头的数字前缀,按前缀分组后统计组内样本量:组内仅1个样本时直接取前缀作为新id,组内样本量大于1时按原有顺序拼接前缀与组内序号,转为数值型即可,方案自动适配不同长度的数字前缀。
方案1:tidyverse 实现(可读性高,推荐)
需要先加载dplyr和stringr包:
library(dplyr) library(stringr) df <- data.frame(id = c(11,21,22,"33_AS_A","33_AS_B","33_AS_X", "35_Part1","35_Part2","35_Part4","35_Part7"), Grade= c(3,3,3, 4,4,4,5,5,5,5)) df2 <- df %>% mutate(id_prefix = str_extract(id, "^\\d+")) %>% group_by(id_prefix) %>% mutate( id = if_else(n() == 1, as.numeric(id_prefix), as.numeric(paste0(id_prefix, row_number()))) ) %>% ungroup() %>% select(id, Grade)
方案2:base R 实现(无需加载额外依赖包)
df <- data.frame(id = c(11,21,22,"33_AS_A","33_AS_B","33_AS_X", "35_Part1","35_Part2","35_Part4","35_Part7"), Grade= c(3,3,3, 4,4,4,5,5,5,5)) # 提取id开头的数字前缀 id_prefix <- sub("^(\\d+).*", "\\1", df$id) # 统计每个前缀的出现次数 prefix_count <- table(id_prefix)[id_prefix] # 生成同前缀下的顺序序号 suffix <- ave(rep(1, nrow(df)), id_prefix, FUN = cumsum) # 按规则生成新id new_id <- ifelse(prefix_count == 1, as.numeric(id_prefix), as.numeric(paste0(id_prefix, suffix))) # 生成结果数据框 df2 <- data.frame(id = new_id, Grade = df$Grade)
两种方案运行后得到的df2均与你给出的预期输出完全一致。
内容的提问来源于stack exchange,提问作者amisos55
相关产品推荐
相关产品推荐

