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

R函数如何将变量作为入参:基于dplyr或data.table实现分组统计

R分组统计函数正确实现方案

dplyr版本实现

你的代码运行报错的核心原因是dplyr采用非标准求值规则,直接将裸变量名作为函数参数传递时,需要用{{ }}(双大括号运算符,又称curly-curly)捕获变量的求值环境,正确代码如下:

# 加载依赖包
library(dplyr)

stp_f <- function(ivar, idur, ie) {
  mydata %>% 
    # 用{{ }}包裹入参变量完成捕获
    group_by({{ ivar }}) %>% 
    summarise(
      sumdur = sum({{ idur }}),
      sumev = sum({{ ie }}),
      failrate = sumev / sumdur
    ) %>% 
    # 重命名分组列同样用{{ }}包裹
    rename(var = {{ ivar }})
}

调用方式和你原有习惯完全一致:

# 测试调用
stp_f(sex, adur, ae)
stp_f(sex, bdur, be)
stp_f(sex, cdur, ce)

输出示例(以第一行调用为例):

# A tibble: 2 × 4
  var    sumdur sumev failrate
  <chr>   <dbl> <dbl>    <dbl>
1 female      6     2    0.333
2 male       80     3    0.0375

data.table版本实现

如果要使用data.table实现同样的功能,只需要用substitute捕获传入的裸变量名,再配合eval完成求值即可,代码如下:

# 加载依赖包
library(data.table)
# 将数据转为data.table格式
setDT(mydata)

stp_f_dt <- function(ivar, idur, ie) {
  # 捕获传入的裸变量表达式
  ivar_exp <- substitute(ivar)
  idur_exp <- substitute(idur)
  ie_exp <- substitute(ie)
  
  # 分组统计
  res <- mydata[, .(
    sumdur = sum(eval(idur_exp)),
    sumev = sum(eval(ie_exp)),
    failrate = sumev / sumdur
  ), by = ivar_exp]
  
  # 重命名分组列
  setnames(res, old = as.character(ivar_exp), new = "var")
  return(res)
}

调用方式和原有习惯一致:

stp_f_dt(sex, adur, ae)

输出结果和dplyr版本完全一致,data.table的计算效率更高,适合处理百万级以上的大样本数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:54:03