En R, el promedio ponderado se calcula con weighted.mean(x, w), donde x son los valores y w los pesos, en el mismo orden. Equivale a sum(x * w) / sum(w), así que los pesos no necesitan sumar 1 ni 100. Viene en el paquete stats, que se carga solo al abrir R.
Sintaxis
weighted.mean(x, w, na.rm = FALSE)
# equivalente a mano
sum(x * w) / sum(w)
| Argumento | Qué es |
|---|---|
x | Los valores a promediar |
w | Los pesos, del mismo largo que x. Si lo omites, todos pesan 1 y obtienes el promedio simple |
na.rm | Con TRUE, elimina los NA de x junto con sus pesos |
Paso a paso
- Escribe los valores en un vector y los pesos en otro, en el mismo orden.
- Comprueba que tengan el mismo largo con
length(x) == length(w). - Llama a
weighted.mean(x, w). - Si hay valores faltantes en
x, agregana.rm = TRUE. - Compara con
mean(x)para ver cuánto cambia la ponderación.
Ejemplos resueltos
Ejemplo 1: calificación con porcentajes de evaluación
El primer parcial vale 30 %, el segundo 30 % y el final 40 %. Las notas son 7.8, 8.4 y 9.1:
notas <- c(7.8, 8.4, 9.1)
pesos <- c(30, 30, 40)
weighted.mean(notas, pesos)
[1] 8.5
7.8 × 30 + 8.4 × 30 + 9.1 × 40 = 234 + 252 + 364 = 850, y 850 / 100 = 8.5. Escribir los pesos como 30, 30 y 40 o como 0.3, 0.3 y 0.4 da el mismo resultado.
Ejemplo 2: precio promedio por litro de gasolina
Tres cargas con distinto precio y distintos litros:
precio <- c(23.89, 24.35, 24.10)
litros <- c(40, 25, 35)
weighted.mean(precio, litros)
mean(precio)
[1] 24.0785
[1] 24.11333
Pagaste 2,407.85 pesos por 100 litros: 24.0785 por litro. El promedio simple de los tres precios (24.11) es más alto porque le da el mismo peso a la carga de 25 litros, que fue la más cara.
Ejemplo 3: columnas de un data frame con un NA
kardex <- data.frame(
materia = c("Cálculo", "Física", "Inglés"),
cal = c(9, NA, 7),
creditos = c(2, 3, 1)
)
weighted.mean(kardex$cal, kardex$creditos)
weighted.mean(kardex$cal, kardex$creditos, na.rm = TRUE)
[1] NA
[1] 8.333333
Con na.rm = TRUE, R quita la fila de Física completa, nota y créditos: (9 × 2 + 7 × 1) / 3 = 8.33. Si Física debe contar con 0, reemplaza el NA antes: kardex$cal[is.na(kardex$cal)] <- 0. Un NA en los pesos, en cambio, no se elimina con na.rm y el resultado sigue siendo NA.
Por grupo
Para un promedio ponderado por grupo con R base, combina sapply y split:
sapply(split(df, df$grupo), function(d) weighted.mean(d$valor, d$peso))
Con dplyr: df |> group_by(grupo) |> summarise(prom = weighted.mean(valor, peso)). El operador |> requiere R 4.1 o posterior; en versiones anteriores usa %>%.
Errores comunes
'x' and 'w' must have the same length. Los vectores tienen distinto largo, a veces por un valor faltante que no se capturó. Revisa conlength().- Pesos que suman cero. El resultado es
NaN(0 / 0). Revisa los datos. - Usar
mean(x * w). Divide entre la cantidad de datos, no entre la suma de pesos. Solo coincide si los pesos suman exactamente la cantidad de datos. - Valores y pesos desalineados. Si ordenas un vector y no el otro, cada peso queda con el valor equivocado. Guarda ambos como columnas del mismo data frame.
Comprueba el resultado con la calculadora de promedio ponderado. En hoja de cálculo se usa SUMAPRODUCTO: mira el promedio ponderado en Excel.
Fuentes
- R Core Team, documentación de weighted.mean (paquete stats). Argumentos x, w y na.rm. Consultado el 11 de noviembre de 2026.