You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 18:52:25