You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 14:06:07