передать переменный список функций для суммирования dplyr - PullRequest
0 голосов
/ 24 марта 2020

Можно ли передать список функций в dplyr :: summaze таким образом, чтобы список функций мог изменяться? Я хотел бы создать общую функцию для создания сводной таблицы, но разрешить разные для разных групп функций в выводе - [править: когда функции не все применяются к одному и тому же столбцу].

Я думал, что это можно сделать, создав общую функцию, с которой группа итоговых функций будет включена в аргументы T / F (где funA = T / F, funB = T / F - это списки функций и пользователь может включать все функции из funA, funB или из обоих), но я не умею писать начальный список функций (funA, funB) - когда функции не все применяются к одному и тому же столбцу. Ниже идея того, как это будет структурировано. Это возможно, или есть лучший способ сделать это?

#Essentially - how would I write a function to selectively include a group of functions (for example either funA = c(n, min, max) or funB=c(n_na, n_neg), or both).  

extract_all <- function(x){

   x %>% summarize(n=n(), 
                   min = min(disp, na.rm=TRUE), 
                   max = max(disp, na.rm=TRUE),
                   n_na = sum(is.na(wt)),  
                   n_neg = sum(vs < 0, na.rm=TRUE))

}
test <- mtcars %>% group_by(cyl) %>% extract_all()

#Does this structure work?
extract_summaries <- function(x, funA=TRUE, funB=FALSE){
  funAls <- list()  #but how do you write n, min, max in here?
  funBls <- list()  #and n_na, n_neg in here

 funls <- append(funAls[funA], funBls[funB])

 summarize(x, funls)
}

#which could be run with:
test <- mtcars %>% group_by(cyl) %>% extract_summaries(funA=TRUE, funB=TRUE)

}

1 Ответ

0 голосов
/ 24 марта 2020

Вот один из вариантов

extract_summaries <- function(x, colnm, funA=TRUE, funB=FALSE){
  funAls <- list(n = length, min= min, max = max) 
  funBls <- list(n_na = function(y) sum(is.na(y)), 
              n_neg = function(y) sum(y < 0, na.rm=TRUE)) 
 funls <- append(funAls[funA], funBls[funB])

 x %>% 
      summarise_at(vars({{colnm}}), funls)
}


test <- mtcars %>% 
           group_by(cyl) %>%
           extract_summaries(mpg, funA=TRUE, funB=TRUE)



test
# A tibble: 3 x 6
#    cyl     n   min   max  n_na n_neg
#  <dbl> <int> <dbl> <dbl> <int> <int>
#1     4    11  21.4  33.9     0     0
#2     6     7  17.8  21.4     0     0
#3     8    14  10.4  19.2     0     0

test <- mtcars %>% 
    group_by(cyl) %>% 
    extract_summaries(mpg, funA = FALSE, funB = TRUE)
test
# A tibble: 3 x 3
#    cyl  n_na n_neg
#  <dbl> <int> <int>
#1     4     0     0
#2     6     0     0
#3     8     0     0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...