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

如何向dplyr函数传递多个group_by参数与动态变量参数

解决dplyr函数中动态传递分组列与计算列的问题

最近写自定义函数用dplyr做分组分位数计算时,踩了个小坑:直接把列名作为参数传给函数,dplyr根本识别不了。后来查了资料,用上quosure(准引用)这套机制就完美解决了,分享下我的实现思路和代码:

核心逻辑就是利用enquo()捕获传入的列参数,转换成quosure对象,再用!!(解引用操作符)在dplyr函数里把它“还原”成实际的列。这样不管是分组列还是要计算分位数的列,都能动态传递了。

先上能正常运行的基础版本代码:

quantileMaker2 <- function(data, groupCol, calcCol) {
  # 将传入的列参数转换成quosure
  groupCol <- enquo(groupCol)
  calcCol <- enquo(calcCol)
  
  data %>%
    group_by(!! groupCol) %>%
    summarise(
      '25%' = currency(quantile(!! calcCol, probs = 0.25, na.rm = TRUE), digits = 2L),
      '50%' = currency(quantile(!! calcCol, probs = 0.5, na.rm = TRUE), digits = 2L),
      '75%' = currency(quantile(!! calcCol, probs = 0.75, na.rm = TRUE), digits = 2L)
    )
}

如果需要支持多个分组列的话,还可以扩展成下面这样,用enquos()捕获多个参数,配合!!!解引用多个quosure:

quantileMakerMulti <- function(data, calcCol, ...) {
  # 捕获多个分组列参数
  groupCols <- enquos(...)
  calcCol <- enquo(calcCol)
  
  data %>%
    # 解引用多个分组列
    group_by(!!! groupCols) %>%
    summarise(
      '25%' = currency(quantile(!! calcCol, probs = 0.25, na.rm = TRUE), digits = 2L),
      '50%' = currency(quantile(!! calcCol, probs = 0.5, na.rm = TRUE), digits = 2L),
      '75%' = currency(quantile(!! calcCol, probs = 0.75, na.rm = TRUE), digits = 2L)
    )
}

简单说下关键函数的作用:

  • enquo():捕获单个参数的表达式(比如你传入的列名),并保留它的上下文,转换成quosure对象
  • enquos():和enquo()类似,不过是用来捕获多个参数的
  • !!:解引用单个quosure,让dplyr把它当作实际的列来处理
  • !!!:解引用多个quosure,适用于需要传入多个参数的场景(比如多列分组)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:01:27