是否有一种稳定(未弃用)的 dplyr 方法可以根据名称向量添加多个列?

Is there a stable (non-deprecated) dplyr way of adding multiple columns based on a vector of names?

提问人:Bastian 提问时间:1/8/2021 更新时间:1/8/2021 访问量:116

问:

假设我有一个简单的 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的

  • 不依赖于任何“被取代”、“已弃用”的东西。

r dplyr 赋值运算符

评论

0赞 stefan 1/8/2021
这回答了你的问题吗?在 dplyr 中基于矢量创建新列

答:

1赞 tmfmnk 1/8/2021 #1

一种方法可以是:

d %>%
 add_column(!!!setNames(rep(NA, length(multip_name)), multip_name))

  A B  x  y  z
1 1 2 NA NA NA