Promedio por grupos en R

Por el equipo de promedio.net · Actualizado el

Para sacar el promedio por grupos en R sin paquetes adicionales, usa aggregate(valor ~ grupo, data = df, FUN = mean), que devuelve un data frame con un promedio por grupo, o tapply(df$valor, df$grupo, mean), que devuelve un vector con nombres. Con dplyr, el equivalente es df |> group_by(grupo) |> summarise(promedio = mean(valor)). Los ejemplos usan mtcars, un conjunto de datos que viene con R, para que obtengas exactamente la misma salida.

Sintaxis

tapply(df$valor, df$grupo, mean)                         # vector con nombres
aggregate(valor ~ grupo, data = df, FUN = mean)          # data frame
aggregate(valor ~ g1 + g2, data = df, FUN = mean)        # dos factores
aggregate(cbind(v1, v2) ~ grupo, data = df, FUN = mean)  # dos columnas

library(dplyr)
df |> group_by(grupo) |> summarise(promedio = mean(valor, na.rm = TRUE))

En mtcars, mpg es el rendimiento en millas por galón, cyl el número de cilindros, am la transmisión (0 automática, 1 manual) y hp la potencia.

Paso a paso

  1. Identifica la columna numérica que vas a promediar y la columna (o columnas) que definen los grupos.
  2. Para una consulta rápida en consola, usa tapply.
  3. Para un resultado que vas a seguir procesando o exportar, usa aggregate o dplyr.
  4. Si hay NA, decide qué hacer con ellos: la interfaz de fórmula de aggregate los descarta; tapply y summarise necesitan na.rm = TRUE.
  5. Agrega el tamaño de cada grupo para interpretar el promedio.

Ejemplos resueltos

Ejemplo 1: rendimiento promedio por cilindros con R base

tapply(mtcars$mpg, mtcars$cyl, mean)
aggregate(mpg ~ cyl, data = mtcars, FUN = mean)
       4        6        8 
26.66364 19.74286 15.10000 
  cyl      mpg
1   4 26.66364
2   6 19.74286
3   8 15.10000

Los autos de 4 cilindros rinden en promedio 26.7 millas por galón, casi el doble que los de 8. tapply es más corto; aggregate deja el grupo como columna, listo para write.csv o para unirlo con merge.

Ejemplo 2: dos factores a la vez

aggregate(mpg ~ cyl + am, data = mtcars, FUN = mean)
  cyl am      mpg
1   4  0 22.90000
2   6  0 19.12500
3   8  0 15.05000
4   4  1 28.07500
5   6  1 20.56667
6   8  1 15.40000

Cada fila es una combinación de cilindros y transmisión. La diferencia entre manual y automático es grande en los autos de 4 cilindros (28.1 contra 22.9) y casi nula en los de 8 (15.4 contra 15.05). Con tapply(mtcars$mpg, list(mtcars$cyl, mtcars$am), mean) obtienes lo mismo como tabla cruzada, con cilindros en filas y transmisión en columnas.

Ejemplo 3: dplyr con promedio y tamaño del grupo

library(dplyr)

mtcars |>
  group_by(cyl) |>
  summarise(promedio = mean(mpg), n = n())
# A tibble: 3 × 3
    cyl promedio     n
  <dbl>    <dbl> <int>
1     4     26.7    11
2     6     19.7     7
3     8     15.1    14

El resultado es un tibble, que imprime solo 3 cifras significativas; los valores guardados son los completos (26.66364…). Para verlos, cambia la opción con options(pillar.sigfig = 7) o convierte el resultado con as.data.frame(). Con n = n() sabes que el promedio de 6 cilindros se basa en solo 7 autos.

Varias columnas a la vez

aggregate(cbind(mpg, hp) ~ cyl, data = mtcars, FUN = mean) promedia rendimiento y potencia por grupo en una sola llamada. En dplyr: summarise(across(c(mpg, hp), mean)). Si necesitas el promedio de cada columna sin agrupar, mira promedio de columnas y filas.

Errores comunes

El mismo cálculo en otros entornos: groupby en Python y GROUP BY en SQL.

Fuentes

  1. R Core Team, documentación de aggregate (paquete stats). Interfaz de fórmula y argumento FUN. Consultado el 11 de noviembre de 2026.
  2. dplyr, summarise. group_by y summarise. Consultado el 11 de noviembre de 2026.