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  6480

Preguntas 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.

Fuentes oficiales