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

是否存在支持多列输入的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 20:05:04