Promedio ponderado en R (weighted.mean)

Por el equipo de promedio.net · Actualizado el

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)
ArgumentoQué es
xLos valores a promediar
wLos pesos, del mismo largo que x. Si lo omites, todos pesan 1 y obtienes el promedio simple
na.rmCon TRUE, elimina los NA de x junto con sus pesos

Paso a paso

  1. Escribe los valores en un vector y los pesos en otro, en el mismo orden.
  2. Comprueba que tengan el mismo largo con length(x) == length(w).
  3. Llama a weighted.mean(x, w).
  4. Si hay valores faltantes en x, agrega na.rm = TRUE.
  5. 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

Comprueba el resultado con la calculadora de promedio ponderado. En hoja de cálculo se usa SUMAPRODUCTO: mira el promedio ponderado en Excel.

Fuentes

  1. R Core Team, documentación de weighted.mean (paquete stats). Argumentos x, w y na.rm. Consultado el 11 de noviembre de 2026.