假设我有一个简单的数据帧:
> d <- data.frame(A=1, B=2)
现在我想添加3列,{X,Y,Z}存储在一个向量中。让我们跳过原因,集中讨论解决方案。
在基础R中,我可以做一些琐碎的事情:
> columns_to_add <- c("X", "Y", "Z")
> d[,columns_to_add] <- NA
> d
A B X Y Z
1 1 2 NA NA NA
但是如何使用dplyr呢?我知道一定有一个使用突变的组合(记住,突变_at,突变_all总有一天会被弃用(,":="赋值运算符和{{}}或三重爆炸运算符!!!rlang::syms((?
让我们有:
> single_name <- c("x")
> multip_name <- c("x", "y", "z")
对于单个名称,它是有效的:
> d %>% mutate(!!sym(single_name) := NA)
A B x
1 1 2 NA
> d %>% mutate({{single_name}} := NA)
A B x
1 1 2 NA
但对于一个以上的名称,它不起作用:
> d %>% mutate({{multip_name}} := NA)
Error: The LHS of `:=` must be a string or a symbol
Run `rlang::last_error()` to see where the error occurred.
> d %>% mutate(!!!syms(multip_name) := NA)
Error: The LHS of `:=` can't be spliced with `!!!`
Run `rlang::last_error()` to see where the error occurred.
它不一定是";突变";,请提出以下建议:
来自tidyverse
不依赖于任何";被取代"被否决的";东西
一种方法可以是:
d %>%
add_column(!!!setNames(rep(NA, length(multip_name)), multip_name))
A B x y z
1 1 2 NA NA NA