如何用列名向量在tidyverse中重命名列?能否用dplyr替代自定义函数
解决方案
完全可以用dplyr的内置函数替代你的自定义change.name函数,无需自行编写逻辑,以下是两种适配你需求的实现方式:
方法1:使用rename() + 命名向量
核心思路是先构建原列名→目标列名的命名向量,再筛选出数据框中实际存在的列名,最后通过!!!解包向量传入rename():
library(dplyr) cnames = tibble(from = c("hair_color", "banana", "height"), to = c("HeadCap", "Orange", "VertMetric")) # 构建命名向量:原列名为名,目标列名为值 name_mapping <- setNames(cnames$to, cnames$from) # 筛选出数据框中存在的列名,避免不必要的警告 name_mapping <- name_mapping[names(name_mapping) %in% colnames(starwars)] # 替换自定义函数为dplyr链式调用 starwars %>% select(name, height, mass, hair_color, skin_color) %>% top_n(5) %>% rename(!!!name_mapping)
方法2:使用rename_with()
rename_with()更适合批量重命名场景,通过.cols参数精准指定要重命名的列(自动忽略不存在的列),.fn参数传入映射逻辑:
library(dplyr) cnames = tibble(from = c("hair_color", "banana", "height"), to = c("HeadCap", "Orange", "VertMetric")) name_mapping <- setNames(cnames$to, cnames$from) starwars %>% select(name, height, mass, hair_color, skin_color) %>% top_n(5) %>% rename_with( .fn = ~ name_mapping[.x], .cols = intersect(names(name_mapping), colnames(.)) )
两种方法都会自动忽略from中不存在的列(比如示例中的banana),不会报错,最终输出结果和你自定义函数的期望输出完全一致。
内容的提问来源于stack exchange,提问作者user2683720
相关产品推荐
相关产品推荐

