#r #dplyr #tidyverse #rlang
#r #dplyr #tidyverse #rlang
Вопрос:
Я пишу функцию с некоторыми аргументами 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"))
Ответ №1:
Вам нужно что-то подобное?
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
также работает.
Комментарии:
1. Функция across() не работает, я попытался обновить dplyr
2. Привет @Ben. Что вы имеете в виду, это не работает? У меня нет ошибок на моей стороне.
across
был введен вdplyr_1.0.0
; вы хотите сказать, что вы используете более старуюdplyr
версию и не можете обновиться?3. PS. Вы можете добиться того же с помощью более старого глагола с ограниченной областью
summarise_at
, но это не рекомендуется, поскольку все глаголы с ограниченной областью были заменены (из-заacross
).4. Как мы устанавливаем na, rm = TRUE при вызове funs?
5. Я получил квантиль