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
- Identifica la columna numérica que vas a promediar y la columna (o columnas) que definen los grupos.
- Para una consulta rápida en consola, usa
tapply. - Para un resultado que vas a seguir procesando o exportar, usa
aggregateo dplyr. - Si hay
NA, decide qué hacer con ellos: la interfaz de fórmula deaggregatelos descarta;tapplyysummarisenecesitanna.rm = TRUE. - 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
NAen el resultado detapplyosummarise. Algún grupo tiene un faltante. Agregana.rm = TRUEcomo argumento extra:tapply(x, g, mean, na.rm = TRUE).- Filas que desaparecen con
aggregate. La interfaz de fórmula usana.action = na.omitpor omisión: elimina toda fila con unNAen cualquiera de las variables de la fórmula. Con varias columnas encbind, un faltante enhpsaca esa fila también del promedio dempg. summarisesingroup_by. Devuelve un solo promedio de toda la tabla.- Conflicto con
plyr. Si cargasplyrdespués dedplyr, susummarisereemplaza al de dplyr e ignora los grupos. Cargadplyral final o escribedplyr::summarise. - Grupos numéricos tratados como números.
cylvale 4, 6 u 8; para gráficas o modelos conviértelo confactor(cyl), así R no lo interpreta como una cantidad continua.
El mismo cálculo en otros entornos: groupby en Python y GROUP BY en SQL.
Fuentes
- R Core Team, documentación de aggregate (paquete stats). Interfaz de fórmula y argumento FUN. Consultado el 11 de noviembre de 2026.
- dplyr, summarise. group_by y summarise. Consultado el 11 de noviembre de 2026.