2011-08-22 19 views
6

Con¿Cómo resumir los datos por grupo con la media ponderada?

xa=aggregate(x$avg,by=list(x$value),FUN=weighted.mean,w=x$weight) 

me da un error

error en weighted.mean.default (X [[1L]], ...): 'x' y 'w' debe tener la misma longitud

Pero

weighted.mean(x$avg,w=x$weight);

funciona bien.

+1

Cuando usa agregado, divide su conjunto de datos en los fragmentos. Entonces, la media ponderada está operando en una porción de datos. Entonces los pesos deberían ser de este pedazo. Sin embargo, proporciona los pesos de todos los datos. De ahí el mensaje de error. – mpiktas

+0

algo así debería funcionar: 'agregado (x [, c (" avg "," peso ")], por = lista (x $ valor), FUN = función (d) weighted.mean (d [, 1], d [, 2])) ' – mpiktas

+0

¿Podría dar algunas etiquetas de ajuste a esta pregunta? (Si este idioma es R, la etiqueta [tag: r] parece correcta.) –

Respuesta

7

Como se sugiere en una old R thread, puede utilizar by lugar:

wt <- c(5, 5, 4, 1)/15 
x <- c(3.7,3.3,3.5,2.8) 
xx <- data.frame(avg=x, value=gl(2,2), weight=wt) 
by(xx, xx$value, function(x) weighted.mean(x$avg, x$weight)) 
5

siendo este un 'millón de maneras de pelar un gato' pregunta, he aquí una solución plyr (usando @ datos de ejemplo de CHL):

ddply(xx,.(value),summarise, wm = weighted.mean(avg,weight)) 
Cuestiones relacionadas