R语言依据另一数据框重命名列时保留无匹配的原列名
R数据框按映射表重命名列且保留无匹配列原名方案
问题原因
你之前的写法返回NA是因为match函数在未匹配到对应值时默认返回NA,只需要对NA位置做原列名填充即可解决。
实现方案
1. 纯基础R实现(无额外依赖)
直接对匹配结果的缺失值做替换:
# 获取匹配后的新列名向量 new_cols <- df2$Col2[match(names(df1), df2$Col1)] # 将NA位置替换为原列名 new_cols[is.na(new_cols)] <- names(df1)[is.na(new_cols)] # 赋值给df1的列名 names(df1) <- new_cols
一行精简写法:
names(df1) <- ifelse(is.na(match(names(df1), df2$Col1)), names(df1), df2$Col2[match(names(df1), df2$Col1)])
2. tidyverse生态实现(dplyr)
如果习惯用tidyverse语法,可借助coalesce函数快速处理缺失值替换:
library(dplyr) # 构造列名映射向量 name_map <- setNames(df2$Col2, df2$Col1) # 重命名,无匹配项保留原名 df1 <- df1 %>% rename_with(~coalesce(name_map[.x], .x))
运行后df1的列名将为E、Q、R、Z、G,符合预期。
内容的提问来源于stack exchange,提问作者ah bon
相关产品推荐
相关产品推荐

