Dplyr:使用 mutate/across 从字符向量添加多列

sta*_*rja 4 r dplyr across

NA我想使用 向 data.frame添加几列(填充) dplyr。我已经在字符向量中定义了列的名称。通常,只有一个新列,您可以使用以下模式:

\n
test %>% \n  mutate(!!new_column := NA)\n
Run Code Online (Sandbox Code Playgroud)\n

但是,我无法让它工作across

\n
test %>% \n  mutate(!!new_column := NA)\n
Run Code Online (Sandbox Code Playgroud)\n

由reprex 包于 2021 年 10 月 5 日创建(v1.0.0)

\n

使用第一种方法,列名已正确创建,但随后它直接尝试在现有列名中查找它。在第二种方法中,除了单个字符串之外,我不能使用任何其他东西。

\n

有没有tidyverse解决方案或者我需要诉诸旧for循环?

\n

akr*_*run 6

!!单个元素的作品

for(nm in add_cols) test <- test %>% 
         mutate(!! nm := NA)
Run Code Online (Sandbox Code Playgroud)

-输出

> test
  a col_1 col_2
1 1    NA    NA
2 2    NA    NA
3 3    NA    NA
Run Code Online (Sandbox Code Playgroud)

或者另一个选择是

test %>% 
   bind_cols(setNames(rep(list(NA), length(add_cols)), add_cols))
  a col_1 col_2
1 1    NA    NA
2 2    NA    NA
3 3    NA    NA
Run Code Online (Sandbox Code Playgroud)

在 中base R,这更容易

test[add_cols] <- NA
Run Code Online (Sandbox Code Playgroud)

可以用在管道中

test %>%
  `[<-`(., add_cols, value = NA)
  a col_1 col_2
1 1    NA    NA
2 2    NA    NA
3 3    NA    NA
Run Code Online (Sandbox Code Playgroud)

across仅当列已经存在时才有效,即建议循环across数据中存在的列并进行一些修改/创建经过.names修改的新列


add_column我们可以利用tibble

library(tibble)
library(janitor)
add_column(test, !!! add_cols) %>% 
   clean_names %>% 
   mutate(across(all_of(add_cols), ~ NA))
  a col_1 col_2
1 1    NA    NA
2 2    NA    NA
3 3    NA    NA
Run Code Online (Sandbox Code Playgroud)