Tenho cerca de 40 colunas que quero resumir por grupo usando dplyr::summarize()
. Mas cada coluna será resumida com uma função diferente: algumas com mean()
, algumas com sum()
, algumas com min()
e algumas com max()
. Apenas uma função será aplicada a cada coluna. Tenho uma tabela de consulta para corresponder cada nome de coluna com a função apropriada. Qual é a melhor maneira de fazer isso dplyr::summarize()
sem ter que escrever cada declaração individualmente?
Aqui está um exemplo de tabela de consulta usando mtcars. O código abaixo não fornece o resultado desejado. Ele aplica todas as dez funções de resumo a todas as dez colunas para um total de 100 resumos, onde eu quero apenas dez resumos, um para cada coluna.
library(dplyr)
lookup_table <- tibble(
variable = c('mpg', 'disp', 'hp', 'drat', 'wt', 'qsec', 'vs', 'am', 'gear', 'carb'),
summ_fn = list(mean, max, min, sum, mean, mean, median, mean, sum, max)
)
mtcars %>%
group_by(cyl) %>%
summarize(across(all_of(lookup_table$variable), .fns = lookup_table$summ_fn))
Em vez de um tibble, inicie sua tabela de consulta em uma lista nomeada onde os nomes são as colunas (por exemplo,
lookup_table <- list("mpg" = mean, "disp" = max,...)
. Então você pode usardplyr::curr_column
para indexar a função para a coluna atual:(Observe que, como eu estava com um pouco de preguiça e você (felizmente) forneceu a tabela de consulta, eu apenas
setNames
atribuí os nomes.)Como @G. Grothendieck aponta nos comentários, se você já tem a tabela de consulta em formato tibble, você pode criar uma pequena função auxiliar e atingir o mesmo objetivo:
Saída (para ambas as abordagens):
Você pode criar uma lista de expressões desativadas e injetá-la
summarize()
usando o operador de injeção!!!
.Sem
dplyr
, usandomapply
diretamente.Aqui está uma variação que complementa o seu original
lookup_table
:Dando
Para passar uma variável diferente para agrupar por (em vez de "cyl"):
E sem nenhum group_by, podemos simplesmente fazer:
Aqui está outra opção base R, usando
by
+Map
o que dá