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

如何在collapse包自定义函数中捕获非引用分组变量?

在collapse自定义函数中支持非引用分组变量的解决方案

要让collapse的自定义函数支持c(cyl, gear)这类非引用分组变量输入,可以通过捕获并解析分组表达式来实现,以下是几种可行的方法:

方法1:使用...参数兼容多种传入方式

通过rlang::enquos()捕获所有传入的分组表达式,再展开c(...)这类组合表达式,最后传给fgroup_by():

library(collapse)
library(rlang)

my_grouped_summary <- function(data, ...) {
  # 捕获所有分组参数表达式
  group_exprs <- enquos(...)
  # 展开嵌套的c(...)表达式
  group_exprs <- flatten(group_exprs)
  # 提取分组列并执行分组
  grouped_data <- fgroup_by(data, !!!group_exprs)
  # 示例:分组计算mpg均值
  fsummarise(grouped_data, mpg_mean = fmean(mpg))
}

# 两种调用方式都生效
my_grouped_summary(mtcars, c(cyl, gear))
my_grouped_summary(mtcars, cyl, gear)

方法2:使用单独分组变量参数+get_vars()(collapse原生工具)

利用collapse自带的get_vars()函数直接解析分组表达式,提取变量名,无需额外加载rlang:

library(collapse)

my_grouped_summary2 <- function(data, grouping_vars) {
  # 解析分组表达式,提取变量名
  group_vars <- get_vars(substitute(grouping_vars), data)
  # 执行分组与后续操作
  grouped_data <- fgroup_by(data, group_vars)
  fsummarise(grouped_data, mpg_mean = fmean(mpg))
}

# 调用测试
my_grouped_summary2(mtcars, c(cyl, gear))
my_grouped_summary2(mtcars, carb)

方法3:手动解析c(...)表达式

如果不想依赖额外工具,可以手动判断并解析分组表达式:

library(collapse)

my_grouped_summary3 <- function(data, grouping_vars) {
  group_expr <- substitute(grouping_vars)
  # 判断是否是c(...)调用,提取内部变量
  if (is.call(group_expr) && as.character(group_expr[[1]]) == "c") {
    group_syms <- lapply(group_expr[-1], as.symbol)
  } else {
    group_syms <- list(group_expr)
  }
  # 分组并处理
  grouped_data <- fgroup_by(data, !!!group_syms)
  fsummarise(grouped_data, mpg_mean = fmean(mpg))
}

# 测试
my_grouped_summary3(mtcars, c(cyl, gear))

核心逻辑说明

collapse的fgroup_by()不会自动解析c(var1, var2)这类组合表达式,需要先将表达式拆解为单独的变量引用:

  1. 用substitute()或enquos()捕获用户传入的原始表达式
  2. 提取c(...)内部的变量名
  3. 通过!!!(非拼接操作符)将变量列表展开传入fgroup_by()

内容的提问来源于stack exchange,提问作者user63230

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 09:26:20