如何基于另一数据框的变量映射对R数据框列重命名?
解决方法:按df1映射替换df2列名
正确实现方式
方式1:使用dplyr的rename_with
先构建var到tes的映射关系,再通过rename_with完成替换:
library(dplyr) # 创建命名映射向量:var值作为名称,对应tes值作为向量元素 name_mapping <- setNames(df1$tes, df1$var) # 重命名df2的列 df2_renamed <- df2 |> rename_with( ~ case_when( .x %in% names(name_mapping) ~ name_mapping[.x], TRUE ~ .x # 保留不需要替换的列名(比如id) ) ) # 查看结果 df2_renamed
输出结果:
id meeny catch 1 1 12 22 2 2 13 23 3 3 14 24
也可以简化写法,直接利用命名向量的索引特性:
df2_renamed <- df2 |> rename_with(~ name_mapping[.x], all_of(intersect(names(name_mapping), names(df2))))
方式2:基础R实现
不需要dplyr的话,直接操作列名:
# 筛选df2中需要替换的列名 target_cols <- intersect(names(df2), df1$var) # 匹配对应的tes值并替换列名 names(df2)[names(df2) %in% target_cols] <- df1$tes[match(target_cols, df1$var)] df2
原代码错误原因
你之前的代码错误在于rename_with的.fn参数要求传入返回字符向量的函数,但你直接传入了数据框df1,不符合参数要求。正确的逻辑是基于列名,从映射关系中找到对应的新名称,而不是直接传入整个数据框。
内容的提问来源于stack exchange,提问作者JontroPothon
相关产品推荐
相关产品推荐

