是否有基于名称向量添加多列的稳定(未弃用)dplyr 方法?
Is there a stable (non-deprecated) dplyr way of adding multiple columns based on a vector of names?
假设我有一个简单的 data.frame:
> 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 做到这一点?我知道必须有一个使用 mutate 的组合(记住,mutate_at、mutate_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
但是对于超过 1 个名称,它不起作用:
> 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
假设我有一个简单的 data.frame:
> 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 做到这一点?我知道必须有一个使用 mutate 的组合(记住,mutate_at、mutate_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
但是对于超过 1 个名称,它不起作用:
> 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