如何用across函数批量创建多列?R语言dplyr代码优化需求
简化多列相乘的R代码实现
当需要处理大量类似var1、var2的列时,确实可以用dplyr的across函数结合表连接来简化代码,也可以用purrr的批量处理函数实现更简洁的写法,以下是两种可行方案:
方案一:dplyr join + across 实现
先将两个表按code连接,再通过across批量处理所有目标列的相乘操作:
library(dplyr) library(stringr) price <- tribble( ~code, ~var1, ~var2, "a", 1, 8, "b", 4, 5 ) quant <- tribble( ~code, ~var1, ~var2, "a", 10, 90, "b", 12, 88 ) tab3 <- price %>% # 按code连接两个表,给重复列名加后缀区分 inner_join(quant, by = "code", suffix = c("_p", "_q")) %>% # 对所有price侧的var列,计算与对应quant侧列的乘积 mutate(across(starts_with("var") & ends_with("_p"), ~ .x * get(str_replace(cur_column(), "_p", "_q")), .names = "{str_remove(.col, '_p')}")) %>% # 只保留需要的code和计算后的var列 select(code, starts_with("var"))
方案二:purrr map2 批量处理列
如果不需要显式连接表,可以直接提取目标列批量相乘后与code列绑定:
library(dplyr) library(purrr) # 定义所有需要相乘的列(排除code) var_cols <- setdiff(names(price), "code") tab3 <- price %>% select(code) %>% # 批量对price和quant的对应列执行相乘,结果按列绑定 bind_cols(map2_dfc(price[var_cols], quant[var_cols], `*`))
两种方案都能避免手动逐个列写相乘逻辑,当新增var3、var4等列时,代码无需修改即可自动适配。
内容的提问来源于stack exchange,提问作者Damien Dotta
相关产品推荐
相关产品推荐

