r - dplyr::summarise 中的 R 用户定义/动态汇总函数
问题描述
如果听起来没有很多类似的问题,很难定义这个问题!
我有一个函数,我希望其中一个参数是函数名称,它将传递给 dplyr::summarise,例如“mean”或“sum”:
data(mtcars)
f <- function(x = mtcars,
groupcol = "cyl",
zCol = "disp",
zFun = "mean") {
zColquo = quo_name(zCol)
cellSummaries <- x %>%
group_by(gear, !!sym(groupcol)) %>% # 1 preset grouper, 1 user-defined
summarise(Count = n(), # 1 preset summary, 1 user defined
!!zColquo := mean(!!sym(zColquo))) # mean should be zFun, user-defined
ungroup
}
(这按 gear 和 cyl 分组,然后返回,每组,count 和 mean(disp))
根据我的笔记,我希望“意思”是动态的,执行 zFun 定义的功能,但我一生都无法弄清楚如何去做!提前感谢您的任何建议。
解决方案
您可以使用match.fun
使函数动态化。我也删除zColquo
了,因为它不需要。
library(dplyr)
library(rlang)
f <- function(x = mtcars,
groupcol = "cyl",
zCol = "disp",
zFun = "mean") {
cellSummaries <- x %>%
group_by(gear, !!sym(groupcol)) %>%
summarise(Count = n(),
!!zCol := match.fun(zFun)(!!sym(zCol))) %>%
ungroup
return(cellSummaries)
}
然后您可以检查输出
f()
# A tibble: 8 x 4
# gear cyl Count disp
# <dbl> <dbl> <int> <dbl>
#1 3 4 1 120.
#2 3 6 2 242.
#3 3 8 12 358.
#4 4 4 8 103.
#5 4 6 4 164.
#6 5 4 2 108.
#7 5 6 1 145
#8 5 8 2 326
f(zFun = "sum")
# A tibble: 8 x 4
# gear cyl Count disp
# <dbl> <dbl> <int> <dbl>
#1 3 4 1 120.
#2 3 6 2 483
#3 3 8 12 4291.
#4 4 4 8 821
#5 4 6 4 655.
#6 5 4 2 215.
#7 5 6 1 145
#8 5 8 2 652
推荐阅读
- python - Django JWT - 如果正文中的密钥有效,则允许没有凭据的请求
- amazon-redshift - Redshift:无法将 JSON 中列表中的多个项目解析为每一行
- amazon-web-services - AWS ECS 任务大小(cpu 和内存)是什么意思?
- javascript - 无法使用“this.refname.current”从 useEffect 访问 Ref
- docker - Nifi 由于 int 上缺少 snappyjava 而无法启动,但在 dev 上却没有
- php - 使用 word press 和 ACF 删除循环中的重复代码
- laravel - 如何在 laravel-6.20 中安装“Laravelium Sitemap 包”
- .net - 如何在 NSubstitute 中模拟属性设置器
- r - Geom_segment 没有读取缺失的美学:x、y、xend 和yend Piper Plot
- javascript - 从 CommonJS 应用程序导出 const 并要求它们在另一个文件中