如何在R(tidyverse)中通过新旧列名对照表修改数据框列名
列名批量替换实现方案
方法1:使用!!!操作符解包命名向量(最推荐)
dplyr::rename()原生支持动态传入命名参数,只需先将对照表转换为「新列名作为向量名、旧列名作为向量值」的命名向量,再用!!!解包传入即可,全程不会修改原有列的数据类型。
library(tidyverse) # 从对照表生成匹配的命名向量 rename_vec <- set_names(x = name_tbl$old_names, nm = name_tbl$new_names) # 解包传入rename完成重命名 mtcars_renamed <- mtcars %>% rename(!!!rename_vec)
运行后调用names(mtcars_renamed)即可验证列名已按对照表替换完成。
方法2:使用rename_with()适配复杂场景
如果需要增加匹配校验、仅替换指定范围的列,可以用rename_with()实现:
mtcars_renamed <- mtcars %>% rename_with( .fn = ~ name_tbl$new_names[match(.x, name_tbl$old_names)], .cols = all_of(name_tbl$old_names) )
两种方案都无需做长宽表转换,不会修改列的原有数据类型,性能远优于转长表关联的实现。如果需要提前校验对照表的合法性,可以增加校验逻辑:
# 校验所有旧列名都存在于原数据框中 stopifnot(all(name_tbl$old_names %in% names(mtcars)))
内容的提问来源于stack exchange,提问作者jzadra
相关产品推荐
相关产品推荐

