передача аргументов для сводного пакета dplyr в R

#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. Я получил квантиль