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

问题描述 投票:0回答:1

我的问题和现有问题之间的区别在于,我想使用

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
替代方案持开放态度。

r dplyr tibble mutate across
1个回答
0
投票

使用

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

尽管我认为这个问题第二个答案(这是这个问题的基础)也同样好。

© www.soinside.com 2019 - 2024. All rights reserved.