在 R 中为摘要 dplyr 包传递参数
passing arguments for summaries dplyr package in R
我正在编写一个带有一些参数的函数 summary_fn <- function(data,...,select_var,fun)
。第一个参数是数据,第二个是group_by,第三个是变量,最后一个是summarise
的多项选择
有什么方法可以用 eval(parse(text= exp)) 映射 summarise
函数?或者无论如何会有帮助?
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
也有效。
我正在编写一个带有一些参数的函数 summary_fn <- function(data,...,select_var,fun)
。第一个参数是数据,第二个是group_by,第三个是变量,最后一个是summarise
有什么方法可以用 eval(parse(text= exp)) 映射 summarise
函数?或者无论如何会有帮助?
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
也有效。