r - 在 R 中传递摘要 dplyr 包的参数
问题描述
我正在编写一个带有一些参数的函数summary_fn <- function(data,...,select_var,fun)
。第一个参数是数据,第二个是group_by,第三个是变量,最后一个是多选summarise
有什么方法可以summarise
用 eval(parse(text=exp)) 映射到函数中?或者无论如何会有帮助?
summary_fn <- function(data,...,select_var,fun){
group <- ensyms(...)
var <- ensym(select_var)
name <- c()
expr <- c()
for( i in 1:length(fun)){
exps <- fun[[i]]
exps <- ensym(exps)
name[[i]] <- paste0(quo_name(exps),"_", quo_name(var))
expr[[i]] <- paste0(exps,"(",var,", na.rm = TRUE)")
}
print(name)
print(expr)
data %>% group_by(!!!group) %>% summarise(.......)
}
summary_fn(mtcars,cyl, am, select_var = mpg,fun = c("mean","max","min"))
解决方案
你在追求这样的事情吗?
library(tidyverse)
summary_fn <- function(data, ..., select_var, fun) {
group <- enquos(...)
var <- enquo(select_var)
funs <- map(setNames(fun, fun), ~.x)
data %>%
group_by(!!!group) %>%
summarise(across(!!var, funs), .groups = "drop")
}
summary_fn(mtcars, cyl, am, select_var = mpg, fun = c("mean", "max"))
## A tibble: 6 x 4
# cyl am mpg_mean mpg_max
# <dbl> <dbl> <dbl> <dbl>
#1 4 0 22.9 24.4
#2 4 1 28.1 33.9
#3 6 0 19.1 21.4
#4 6 1 20.6 21
#5 8 0 15.0 19.2
#6 8 1 15.4 15.8
如果您提供fun
名称list
,则可以跳过该funs <- map(...)
步骤。
PS。替换enquo
和ensym
也enquos
可以ensyms
。
推荐阅读
- javascript - Google Places API next_page_token 从不返回附近搜索的“OK”响应
- awk - awk 字段分隔符区分 -1、10 和 1
- python - Data mapping to dictionary or JSON?
- php - 您能帮我将看似 json 的值转换为逗号分隔的值吗?
- python - How to find the longest sequence of equal elements in a sequence?
- .net - 目前正在尝试学习 Microsoft.net 核心,但它给出了这个错误值不能为空。(参数“连接字符串”)
- javascript - javascript字符串中的HTML注释的奇怪行为
- salesforce - Salesforce:根据文本列表评估潜在客户字段的复选框
- javascript - 解构对象反应来自firebase的本机钩子返回未定义
- json - How to access JSON object key and value in ReactJS