En R, el promedio de una columna de un data frame se calcula con mean(df$columna). Para el promedio de varias columnas a la vez usa colMeans(df[, columnas]) y para el promedio de cada fila, rowMeans(df[, columnas]). Las dos funciones exigen columnas numéricas y aceptan na.rm = TRUE para ignorar los faltantes.
Sintaxis
mean(df$col) # una columna
colMeans(df[, c("a", "b")], na.rm = TRUE) # promedio de cada columna
rowMeans(df[, c("a", "b")], na.rm = TRUE) # promedio de cada fila
sapply(df[sapply(df, is.numeric)], mean) # todas las columnas numéricas
apply(m, 1, mean) # filas de una matriz (2 = columnas)
colMeans y rowMeans están escritas en C y son mucho más rápidas que apply con tablas grandes, además de más legibles.
Paso a paso
- Revisa las columnas con
str(df): las que vas a promediar deben sernumoint. - Selecciona solo esas columnas, por nombre (
c("p1", "p2")) o por posición (2:4). - Usa
colMeanspara un promedio por columna orowMeanspara uno por fila. - Agrega
na.rm = TRUEsi hay faltantes y decide si eso es justo para cada fila. - Guarda el resultado como columna nueva con
df$promedio <- ....
Datos de ejemplo:
cal <- data.frame(
alumno = c("Ana", "Luis", "Sofía", "Diego"),
p1 = c(8.5, 6.0, 9.0, 7.5),
p2 = c(9.0, 7.0, 8.5, NA),
p3 = c(7.5, 8.0, 10.0, 7.0)
)
Ejemplos resueltos
Ejemplo 1: promedio de cada parcial
colMeans(cal[, 2:4])
colMeans(cal[, 2:4], na.rm = TRUE)
p1 p2 p3
7.750 NA 8.125
p1 p2 p3
7.750000 8.166667 8.125000
Diego no presentó el segundo parcial, así que sin na.rm el promedio de p2 es NA. Con na.rm = TRUE, p2 se calcula con los 3 alumnos que sí lo presentaron: 24.5 / 3 = 8.17. R muestra todos los valores del vector con la misma cantidad de decimales, por eso aparecen 7.750000 y 8.125000.
Ejemplo 2: promedio de cada alumno como columna nueva
cal$promedio <- round(rowMeans(cal[, c("p1", "p2", "p3")], na.rm = TRUE), 2)
cal
alumno p1 p2 p3 promedio
1 Ana 8.5 9.0 7.5 8.33
2 Luis 6.0 7.0 8.0 7.00
3 Sofía 9.0 8.5 10.0 9.17
4 Diego 7.5 NA 7.0 7.25
El promedio de Diego (7.25) usa solo sus dos parciales. Si el reglamento dice que un parcial no presentado vale 0, reemplaza antes los NA: cal$p2[is.na(cal$p2)] <- 0, y su promedio bajaría a 4.83. Seleccionar las columnas por nombre evita que la nueva columna promedio entre en cálculos posteriores por accidente.
Ejemplo 3: todas las columnas numéricas sin escribir sus nombres
Con tablas anchas no conviene listar columnas. Filtra las numéricas con sapply(df, is.numeric):
num <- sapply(cal, is.numeric)
round(sapply(cal[num], mean, na.rm = TRUE), 2)
p1 p2 p3 promedio
7.75 8.17 8.12 7.94
Ahora también aparece la columna promedio creada en el ejemplo 2, porque es numérica: revisa siempre qué columnas quedaron. Fíjate además en p3: 8.125 se redondea a 8.12, porque R sigue la norma IEC 60559 y, para un 5 final exacto, redondea al par. En dplyr, lo equivalente es summarise(across(where(is.numeric), \(x) mean(x, na.rm = TRUE))).
Errores comunes
'x' must be numeric. Le pasaste acolMeansorowMeansun data frame con una columna de texto (aquí,alumno). Selecciona solo las numéricas.mean(df)devuelveNAcon una advertencia.meanno recorre columnas. UsacolMeansosapply.- Confundir filas y columnas en
apply. Enapply(m, 1, mean)el 1 significa filas y el 2 columnas. - Rellenar con
na.rm = TRUEsin pensar. En el promedio por fila, una persona con un solo dato queda comparada con otras que tienen tres. Revisa cuántos datos tiene cada fila conrowSums(!is.na(cal[, 2:4])).
El mismo cálculo en pandas está en promedio de una columna en pandas. Las reglas escolares de redondeo y de calificaciones faltantes se explican en cómo sacar el promedio de calificaciones.
Fuentes
- R Core Team, documentación de colSums, rowSums, colMeans y rowMeans (paquete base). Argumento na.rm y requisito de datos numéricos. Consultado el 11 de noviembre de 2026.