R语言如何基于数据框另一列生成重复值对应相同ID的新列
R语言按列首次出现顺序生成唯一ID列实现方案
核心逻辑是提取cdr3列的去重值(保留首次出现顺序),给每个去重值分配从1开始的连续编号,拼上X前缀后映射回原数据的每一行,重复值自动复用对应编号。
方法1:基础R实现(无需安装第三方包)
直接用内置函数完成,兼容性最好:
# 构造测试数据(对齐示例输出的cdr3列名) TCR <- c("CAAETSGSRLTF;CASSQEGTGVYEQYF","CGSRLTF;CASSQEGTGVYEQYF","CAAETSGSRLTF;CASSQEGT", "CAAETSGSRLTF;CASSQEGTGVYEQYF") df <- data.frame(cdr3 = TCR) # 生成ID列 df$ID <- paste0("X", match(df$cdr3, unique(df$cdr3)))
运行后输出的df和预期效果完全一致:
> df cdr3 ID 1 CAAETSGSRLTF;CASSQEGTGVYEQYF X1 2 CGSRLTF;CASSQEGTGVYEQYF X2 3 CAAETSGSRLTF;CASSQEGT X3 4 CAAETSGSRLTF;CASSQEGTGVYEQYF X1
方法2:dplyr实现(适配tidyverse工作流)
如果日常使用tidyverse生态处理数据,可以用分组编号的方式实现:
library(dplyr) # dplyr 1.1.0及以上版本写法 df <- df %>% mutate(ID = paste0("X", cur_group_id()), .by = cdr3) # 低版本dplyr兼容写法 # df <- df %>% # group_by(cdr3) %>% # mutate(ID = paste0("X", cur_group_id())) %>% # ungroup()
说明
- 两种方法都严格按照cdr3值在数据中首次出现的顺序分配ID,后续重复值直接复用已分配的ID,不会出现编号错乱
- 如果需要修改ID前缀,直接替换
paste0()函数中第一个参数的字符串即可,例如需要前缀为TCR_ID_就改为paste0("TCR_ID_", 序号部分)
内容的提问来源于stack exchange,提问作者Ahmed Hassan
相关产品推荐
相关产品推荐

