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
相关产品推荐
相关产品推荐

