在 R 中使用 across() 创建多个新列

Ear*_*ien 3 r dplyr mutate tibble across

我的问题和现有问题之间的区别在于,我想创建mutate依赖于现有列的新列。

一些虚拟数据:

library(dplyr)
dat <- tibble(
    a = 1:5,
    b = LETTERS[1:5]
)
Run Code Online (Sandbox Code Playgroud)

我知道我可以像这样一一创建新列

dat <- dat %>%
    mutate(foo = NA, bar = NA, bar2 = NA)
Run Code Online (Sandbox Code Playgroud)

我可以使用更方便地修改across,例如:

new_vars <- c("foo", "bar", "bar2")
dat <- dat %>%
    mutate(across(all_of(new_vars), ~ replace(., is.na(.), 0)))
Run Code Online (Sandbox Code Playgroud)

但是,如何在不以类似方式引用现有列的情况下创建新列呢?例如添加新列填充NA

tibble(
    a = 1:5,
    b = LETTERS[1:5]
) %>% 
    # mutate(across(all_of(new_vars), ~ function(.x) NA))  # Error
    mutate(across(all_of(new_vars), NA))                   # Error
Run Code Online (Sandbox Code Playgroud)

对任何tidyverse替代方案持开放态度。

jps*_*ith 5

与隐藏在此处的热门问题中的答案类似,您可以使用:

new_vars <- c("foo", "bar", "bar2")

tibble(
  a = 1:5,
  b = LETTERS[1:5]
) %>% 
  mutate(!!!setNames(rep(NA, length(new_vars)), new_vars))
# or (thanks @joran)
# tibble::add_column(!!!setNames(rep(NA, length(new_vars)), new_vars))
Run Code Online (Sandbox Code Playgroud)

输出

     a b     foo   bar   bar2 
  <int> <chr> <lgl> <lgl> <lgl>
1     1 A     NA    NA    NA   
2     2 B     NA    NA    NA   
3     3 C     NA    NA    NA   
4     4 D     NA    NA    NA   
5     5 E     NA    NA    NA   
Run Code Online (Sandbox Code Playgroud)