R语言使用mutate结合命名向量复制tibble列并保留原有列名
解决方案
你可以通过以下两种简洁的方式实现需求,既保留原列,又按命名向量的映射生成副本列:
方法1:与rename语法兼容的!!!注入写法(推荐,写法最简洁)
你只需要对原命名向量做简单转换后注入mutate即可,和你已掌握的rename写法逻辑高度一致:
library(dplyr) named_vector <- c("var1" = "x1", "var2" = "x2", "var3" = "x3") tibble(x1 = 1:3, x2 = 1:3, x3 = 1:3, z = 68, zz = 69) %>% mutate(!!!set_names(syms(named_vector), names(named_vector)))
运行输出和你给出的期望结果完全相同:
# A tibble: 3 × 8 x1 x2 x3 z zz var1 var2 var3 <int> <int> <int> <dbl> <dbl> <int> <int> <int> 1 1 1 1 68 69 1 1 1 2 2 2 2 68 69 2 2 2 3 3 3 3 68 69 3 3 3
逻辑说明:syms(named_vector)会把原列名转换为dplyr可识别的列符号,set_names将这些符号的名称设置为你需要的新列名,最后通过!!!操作符批量注入到mutate中,等效于你手动写全所有新列=原列的赋值语句。
方法2:across + .names参数写法(dplyr 1.0.0及以上版本支持)
如果你需要后续对副本列做统一修改,可以用across的写法,扩展性更强:
library(dplyr) named_vector <- c("var1" = "x1", "var2" = "x2", "var3" = "x3") tibble(x1 = 1:3, x2 = 1:3, x3 = 1:3, z = 68, zz = 69) %>% mutate(across(all_of(unname(named_vector)), .fns = identity, .names = "{names(named_vector)[match(.col, named_vector)]}"))
运行结果和方法1完全一致。
内容的提问来源于stack exchange,提问作者John-Henry
相关产品推荐
相关产品推荐

