R语言使用dplyr时如何通过字符对象动态重命名数据框列?
问题原因
dplyr::rename() 默认把等号左侧的输入作为字面列名处理,不会自动读取变量内存储的字符值,所以直接写rename(name1 = col1, name2 = col2)时,会直接将列名设置为name1、name2本身,不会取两个变量中存储的"A""B"值。
可行解决方案
1. dplyr动态注入写法(适配管道操作,推荐)
通过构造命名向量+!!!注入的方式实现动态传参,重命名映射的规则是 向量名为新列名,向量值为原列名:
library(dplyr) # 构造重命名映射,会自动解析name1、name2存储的值作为新列名 col_rename <- c( "{name1}" := "col1", "{name2}" := "col2" ) # 若使用dplyr 1.0以上版本,也可以直接写为: # col_rename <- c(name1 = "col1", name2 = "col2") # 执行重命名 datatest_renamed <- datatest %>% rename(!!!col_rename)
如果后续name1、name2的值动态变化,只要重新构造映射就能得到正确结果,不需要硬编码列名。
如果需要批量对应多列,也可以用setNames快速生成映射:
# 按顺序把原列col1、col2重命名为name1、name2存储的值 col_rename <- setNames(c("col1", "col2"), c(name1, name2)) datatest_renamed <- datatest %>% rename(!!!col_rename)
2. 基础R写法(无需加载第三方包)
直接通过列名索引赋值实现,逻辑更直白,也不会有非标准计算的问题:
datatest_renamed <- datatest # 按原列名匹配替换(不受列顺序变动影响,更稳妥) names(datatest_renamed)[names(datatest_renamed) == "col1"] <- name1 names(datatest_renamed)[names(datatest_renamed) == "col2"] <- name2
3. kable输出场景的简化写法
如果只是生成表格时需要动态显示列名,不需要提前修改数据框列名,直接给kable的col.names传参即可:
library(knitr) kable(datatest, col.names = c(name1, name2))
内容的提问来源于stack exchange,提问作者J_sdata
相关产品推荐
相关产品推荐

