我的问题和现有问题之间的区别在于,我想使用
mutate
创建新列,不 依赖于现有列。
一些虚拟数据:
library(dplyr)
dat <- tibble(
a = 1:5,
b = LETTERS[1:5]
)
我知道我可以像这样一一创建新列
dat <- dat %>%
mutate(foo = NA, bar = NA, bar2 = NA)
我可以使用 across
更方便地
修改列,例如:
new_vars <- c("foo", "bar", "bar2")
dat <- dat %>%
mutate(across(all_of(new_vars), ~ replace(., is.na(.), 0)))
但是如何在不以类似方式引用现有列的情况下创建新列呢?例如。添加填充有
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
对任何
tidyverse
替代方案持开放态度。
使用
dplyr::bind_cols()
和管道:
library(dplyr)
tibble(a = 1:5,
b = LETTERS[1:5]) %>%
bind_cols(., setNames(lapply(new_vars, function(x) x = NA), new_vars))
结果:
# A tibble: 5 × 5
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
尽管我认为这个问题的第二个答案(这是这个问题的基础)也同样好。