如何在R中使用across()创建不依赖现有列的多个新列
批量创建不依赖现有列的新列(tidyverse方案)
首先明确:dplyr::across()是用来操作已存在的列的,它的第一个参数是针对现有列的选择器,所以没法用它直接创建全新的列,得换其他思路。下面是几种实用的tidyverse方案:
方法1:用mutate()结合!!!解包临时tibble
这是最贴近批量操作需求的写法,通过构造带列名的临时tibble,再解包传入mutate():
library(dplyr) dat <- tibble(a = 1:5, b = LETTERS[1:5]) new_vars <- c("foo", "bar", "bar2") # 批量添加NA填充的新列 dat <- dat %>% mutate(!!!tibble(!!!set_names(rep(list(NA), length(new_vars)), new_vars)))
set_names(rep(list(NA), length(new_vars)), new_vars):给每个NA值(用列表包裹是为了保留向量长度)绑定对应的列名tibble(...):把命名后的NA元素转成临时 tibble!!!:把临时tibble解包成mutate()的多个参数,等价于手动写foo=NA, bar=NA, bar2=NA
方法2:用bind_cols()直接绑定新列tibble
这个写法更直观,直接生成新列的tibble,再和原数据绑定:
dat <- dat %>% bind_cols(tibble(!!!set_names(rep(list(NA), length(new_vars)), new_vars)))
方法3:结合purrr::map_dfc生成新列
如果需要更灵活的填充逻辑(比如填充0、随机数等),可以用purrr的函数批量生成列:
library(purrr) library(dplyr) # 批量添加NA列 dat <- dat %>% bind_cols(map_dfc(set_names(new_vars), ~ rep(NA, nrow(.)))) # 如果要填充其他值,比如0,只需要把NA换成0 dat <- dat %>% bind_cols(map_dfc(set_names(new_vars), ~ rep(0, nrow(.))))
补充:单个新列的简化写法
如果只是加少量新列,直接写最直观:
dat <- dat %>% mutate(foo = NA, bar = NA, bar2 = NA)
内容的提问来源于stack exchange,提问作者Earlien
相关产品推荐
相关产品推荐

