如何通过交叉对照dataframe替换目标dataframe的重复值并新增列
你可以通过构造映射向量或者关联匹配两种方式实现需求,两种常用实现方案如下:
构造示例数据(可跳过,直接套用你自己的数据集即可)
# 原始A矩阵数据框 df_A <- data.frame( V1 = c(1,2,2,3,3,3), V2 = c(1,1,2,1,2,3), V3 = c(1,0,1,0,0,1) ) # ID交叉对照映射表 df_map <- data.frame( ID = c("SE1", "T3", "R5", "R7", "R9", "A11"), newID = 1:6 )
方案1:基础R实现(无需加载第三方包)
核心思路是先构造「新ID-原始ID」的命名映射向量,直接匹配取值生成新列:
# 构造映射向量,名称为newID,值为对应原始ID id_mapper <- setNames(df_map$ID, df_map$newID) # 匹配V1、V2的值生成ID1、ID2列 df_A$ID1 <- id_mapper[as.character(df_A$V1)] df_A$ID2 <- id_mapper[as.character(df_A$V2)]
方案2:tidyverse/dplyr实现(适合已在使用tidyverse生态的场景)
通过两次左关联匹配生成新列:
library(dplyr) df_result <- df_A %>% # 匹配V1对应的原始ID,命名为ID1 left_join(df_map, by = c("V1" = "newID")) %>% rename(ID1 = ID) %>% # 匹配V2对应的原始ID,命名为ID2 left_join(df_map, by = c("V2" = "newID")) %>% rename(ID2 = ID)
两种方案执行后得到的结果和你需要的目标结构完全一致。
内容的提问来源于stack exchange,提问作者Victoria Topayan
相关产品推荐
相关产品推荐

