是否存在支持多列输入的dplyr across函数版本?
解决方案
当需要对成对的列(如a1&b1、a2&b2)调用双参数函数进行汇总时,可以通过以下几种方式避免重复编写代码:
方法一:利用across+cur_column匹配对应列
如果你的a列和b列命名有规律(比如前缀为a/b、后缀一致),可以用cur_column()获取当前处理的a列名称,替换前缀得到对应的b列,再传入函数:
首先定义示例双参数函数:
fn <- function(x, y) { # 示例逻辑:计算两列的均值之和 mean(x) + mean(y) }
然后执行汇总:
library(dplyr) library(stringr) data1 %>% summarise( across( starts_with("a"), ~ fn(.x, pick(str_replace(cur_column(), "^a", "b"))[[1]]), .names = "ab{col}" # 自动生成ab1、ab2这类列名 ) )
str_replace(cur_column(), "^a", "b"):把当前a列的列名(如a1)替换成对应的b列名(如b1)pick():取出对应的b列,[[1]]将数据框转换为向量,适配函数的参数要求
方法二:通过列名分组+purrr::map批量处理
如果列名的规律更灵活,可以先提取列对的共同标识,再用map批量调用函数:
library(dplyr) library(purrr) library(stringr) # 提取a列的后缀(如1、2、3) prefixes <- str_extract(names(data1)[starts_with("a")], "\\d+$") data1 %>% summarise( !!!set_names( map(prefixes, ~ fn(pull(data1, paste0("a", .x)), pull(data1, paste0("b", .x)))), paste0("ab", prefixes) ) )
pull(data1, paste0("a", .x)):根据后缀取出对应的a列和b列!!!:将map生成的命名列表展开为summarise的参数set_names:为结果设置对应的ab1、ab2列名
注意事项
- 确保你的
fn函数能够正确处理向量输入(因为dplyr的列都是向量) - 如果列名没有固定规律,可先手动定义列对的映射关系(比如列名对的列表),再用
map处理
内容的提问来源于stack exchange,提问作者xiaodai
相关产品推荐
相关产品推荐

