Crea resúmenes estadísticos en R con 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
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
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
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
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:
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
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