2012-06-12 20 views
5

Duplicar posible:
Calculating weighted mean and standard deviation¿Cómo calcular la media ponderada en R?

¿Cómo puedo calcular la media ponderada en R?

Por ejemplo, tengo 4 elementos de los cuales 1 elemento es de tamaño (o: longitud, anchura, etc.) 10 y 3 elementos son de tamaño 2.

> z = data.frame(count=c(1,3), size=c(10,2)) 
> z 
    count size 
1  1 10 
2  3 2 

La media ponderada es (10 * 1 + 2 * 3)/4 = 4.

+1

¿Por qué el voto a favor? – Frank

+6

Hablando por mí mismo, he votado negativamente porque una búsqueda en Google de "promedio ponderado en R" devuelve la página de ayuda para weighted.mean como el primer resultado. – joran

+3

@Frank Pase el cursor sobre el triángulo inferior debajo del recuento de votos al lado de su Q. La información sobre herramientas dice: "Esta pregunta no muestra ningún esfuerzo de investigación; ...". Dado que alguien aquí ya ha pedido una Q muy similar que podría encontrarse fácilmente a través de una búsqueda, y una búsqueda en Google lo lleva a la respuesta correcta, esa puede ser la razón por la que obtuvo votos atrasados ​​y cerró su Q. –

Respuesta

19

Uso weighted.mean:

> weighted.mean(z$size, z$count) 
[1] 4 
11

Parece que usted ya sabe cómo calcular esto, sólo necesitan un empujón en la dirección correcta para ponerlo en práctica. Puesto que R es vectorizado, esto es bastante simple:

with(z, sum(count*size)/sum(count)) 

El bit with solo ahorra en escribir y es equivalente a sum(z$count*z$size)/sum(z$count)

O utilizar el construido en función de weighted.mean() como también se ha señalado. Usar su propia función puede ser más rápido, aunque no hará la misma cantidad de errores comprobando que la función integrada lo hace.

builtin <- function() with(z, weighted.mean(count, size)) 
rollyourown <- function() with(z, sum(count*size)/sum(count)) 

require(rbenchmark) 
    benchmark(builtin(), rollyourown(), 
      replications = 1000000, 
      columns = c("test", "elapsed", "relative"), 
      order = "relative") 
#----- 
      test elapsed relative 
2 rollyourown() 13.26 1.000000 
1  builtin() 22.84 1.722474 
Cuestiones relacionadas