Crea resúmenes estadísticos en R con la función summarise() de dplyr

La función summarise() de dplyr

La función summarise (o summarize) se utiliza para agregar y resumir datos. Es especialmente útil para resumir datos en una única fila por grupo, ofreciendo varios resúmenes estadísticos o cálculos para cada grupo. Esta función crea un nuevo data frame con las estadísticas de resumen especificadas.

Sintaxis

La función summarise o summarize toma un conjunto de datos como entrada y crea uno nuevo cuyas columnas se calculan aplicando una función a una o varias columnas de los datos originales. La sintaxis es la siguiente:

summarise(data, nueva_columna = function(columna))

summarise y summarize son la misma función.

Resúmen estadístico de los datos

Dado un conjunto de datos, puedes generar un nuevo data frame que contenga resúmenes estadísticos de variables específicas del data frame original. La siguiente tabla describe algunas de las funciones más útiles para utilizar con summarise, como mean o sum.

Función Descripción
mean() Media de los valores
median() Mediana de los valores
sd(), var() Desviación típica y varianza de los valores
quantile() Cuantiles de los valores
IQR() Rango intercuartílico
min(), max() Valores mínimo y máximo
first() Primer valor
last() Último valor
nth() Valor enésimo
n() Número de elementos por grupo
n_distinct() Número de valores únicos

En el siguiente ejemplo se muestra cómo generar un nuevo data frame que contenga el promedio de las variables numéricas del data frame original.

library(dplyr)

set.seed(9)
df <- data.frame(group = sample(c("G1", "G2"), 5, replace = TRUE),
                 x = sample(1:50, 5), y = sample(1:50, 5))

# Media de 'x' y media de 'y'
df_2 <- df %>%
  summarise(mean_x = mean(x), mean_y = mean(y))

df_2
  mean_x mean_y
1   21.6   38.2

La función summarise() o summarize() de dplyr en R

Ten en cuenta que la salida resultante contendrá tantas filas como los valores devueltos por la función de entrada.

library(dplyr)

set.seed(9)
df <- data.frame(group = sample(c("G1", "G2"), 5, replace = TRUE),
                 x = sample(1:50, 5), y = sample(1:50, 5))

# Cuartiles de 'x' y cuartiles de 'y'
df_2 <- df %>%
  summarise(quartiles_x = quantile(x), quartiles_y = quantile(y))

df_2
  quartiles_x quartiles_y
1           3          18
2          12          37
3          19          42
4          30          44
5          44          50

Crear resúmenes estadísticos de datos en dplyr

Resumir datos por grupo con group_by

La función summarise es especialmente útil junto con group_by, ya que permite que el nuevo data frame contenga resúmenes estadísticos para cada grupo.

El ejemplo siguiente calcula la media de cada columna en función de los grupos de la variable group.

library(dplyr)

set.seed(9)
df <- data.frame(group = sample(c("G1", "G2"), 5, replace = TRUE),
                 x = sample(1:50, 5), y = sample(1:50, 5))

# Suma de 'x' y suma de 'B' por grupo
df_2 <- df %>%
  group_by(group) %>%
  summarise(mean_x = sum(x), mean_y = sum(y))

df_2
# A tibble: 2 × 3
  group mean_x mean_y
  <chr>  <int>  <int>
1 G1        52     97
2 G2        56     94

Resumir datos por grupos con summarise() y group_by() en R

Además, puedes agrupar los datos usando más de una variable categórica. En este caso, la función calcula resúmenes estadísticos para cada grupo y subgrupo. Por defecto, la salida se agrupa por la primera variable categórica, como indica un mensaje.

library(dplyr)

set.seed(9)
df <- data.frame(group = sample(c("G1", "G2"), 5, replace = TRUE),
                 group_2 = sample(c("G3", "G4"), 5, replace = TRUE),
                 x = sample(1:50, 5), y = sample(1:50, 5))

# Suma de 'x' y suma de 'y' por grupos
df_2 <- df %>%
  group_by(group, group_2) %>%
  summarise(sum_x = sum(x), sum_y = sum(y))

df_2
`summarise()` has grouped output by 'group'. You can override using the `.groups` argument.
# A tibble: 4 × 4
# Groups:   group [2]
  group group_2 mean_x mean_y
  <chr> <chr>    <int>  <int>
1 G1    G3          74     86
2 G1    G4          18     30
3 G2    G3          48     22
4 G2    G4          37     35

Resumir datos por grupo en dplyr con las funciones summarise() y group_by()

El argumento .groups es opcional y puede tomar uno de los siguientes valores: "drop_last" para eliminar el último nivel de agrupación, "drop" para eliminar todos los grupos, "keep" para conservar la agrupación original o "rowwise", para tratar cada fila como su propio grupo.

library(dplyr)

set.seed(9)
df <- data.frame(group = sample(c("G1", "G2"), 5, replace = TRUE),
                 group_2 = sample(c("G3", "G4"), 5, replace = TRUE),
                 x = sample(1:50, 5), y = sample(1:50, 5))

# Suma de 'x' y suma de 'y' por grupo
df_2 <- df %>%
  group_by(group, group_2) %>%
  summarise(sum_x = sum(x), sum_y = sum(y), .groups = "drop")

df_2
# A tibble: 4 × 4
  group group_2 sum_x sum_y
  <chr> <chr>   <int> <int>
1 G1    G3         74    86
2 G1    G4         18    30
3 G2    G3         48    22
4 G2    G4         37    35

Observa la diferencia respecto a la salida anterior:

Resume los datos por varios grupos y luego elimina los niveles de agrupación en dplyr

Resumir varias columnas

En lugar de especificar manualmente varias columnas, puedes crear resúmenes seleccionándolas en base a una condición utilizando summarise en combinación con across. Revisa la lista de funciones de ayuda para seleccionar columnas.

En el siguiente ejemplo, se calcula la varianza de todas las columnas excepto para group, y las columnas resultantes se renombran utilizando los nombres originales de las columnas con el sufijo "_var".

library(dplyr)

set.seed(9)
df <- data.frame(group = sample(c("G1", "G2"), 5, replace = TRUE),
                 x = sample(1:50, 5), y = sample(1:50, 5))

# Resume todas las columnas por su varianza menos 'group'
df_2 <- df %>%
  summarise(across(!group, var, .names = "{.col}_var"))

df_2
  x_var y_var
1 254.3 149.2

Resumir los datos de una selección de columnas mediante las funciones summarise() y across() de dplyr

La función where es muy útil ya que permite la selección de columnas basándose en una condición, como elegir sólo columnas numéricas utilizando where(is.numeric).

Por ejemplo, el siguiente código calcula la mediana de todas las variables numéricas.

library(dplyr)

set.seed(9)
df <- data.frame(group = sample(c("G1", "G2"), 5, replace = TRUE),
                 x = sample(1:50, 5), y = sample(1:50, 5))

# Resume TODAS las variables NUMÉRICAS por su mediana
df_2 <- df %>%
  summarise(across(where(is.numeric), median, .names = "{.col}_median"))

df_2
  x_median y_median
1       19       42

Las funciones summarise() y across() de dplyr