Agrupar y resumir en R: como una tabla dinámica
group_by() y summarise() hacen lo que una tabla dinámica en Excel, pero queda escrito y se repite con un clic.
Los datos
library(tidyverse)
ventas <- read_csv("https://grafoso.com/r/ventas.csv", show_col_types = FALSE) |>
mutate(importe = cantidad * precio)Totales por grupo
n() cuenta filas.
ventas |>
group_by(sucursal) |>
summarise(
ventas = n(),
total = sum(importe),
promedio = mean(importe)
) |>
arrange(desc(total))# A tibble: 3 × 4
sucursal ventas total promedio
<chr> <int> <dbl> <dbl>
1 Sur 18 37735 2096.
2 Norte 18 37025 2057.
3 Centro 18 30140 1674.Una tabla cruzada
month() saca el mes de una fecha, y pivot_wider() pasa los productos a columnas.
ventas |>
mutate(mes = month(fecha)) |>
group_by(mes, producto) |>
summarise(total = sum(importe), .groups = "drop") |>
pivot_wider(names_from = producto, values_from = total)# A tibble: 6 × 4
mes Café Galletas Té
<dbl> <dbl> <dbl> <dbl>
1 1 5780 3060 3660
2 2 5440 4410 3960
3 3 6545 4140 5400
4 4 10370 4140 6060
5 5 11390 5355 4980
6 6 8330 5400 6480Preguntas frecuentes
¿Qué pasa si hay valores vacíos?
sum() y mean() devuelven NA si hay vacíos. Usa na.rm = TRUE para ignorarlos, después de revisar por qué faltan.
¿Por qué algunos números salen redondeados?
La tabla los muestra abreviados para que quepan, pero el valor completo se conserva.