2010-07-18 11 views
9

Estoy tratando de hacer un "grupo por" - media ponderada por estilo en R. Con algunas medias básicas el siguiente código (usando el paquete plyr de Hadley) funcionó bien.agrupar por en R, ddply con weighted.mean

ddply(mydf,.(period),mean) 

Si utilizo el mismo enfoque con weighted.mean me sale el siguiente error " 'x' y 'w' debe tener la misma longitud", lo que no entiendo porque la parte weighted.mean trabaja fuera ddply.

weighted.mean(mydf$mycol,mydf$myweight) # works just fine 
ddply(mydf,.(period),weighted.mean,mydf$mycol,mydf$myweight) # returns the erros described above 
ddply(mydf,.(period),weighted.mean(mydf$mycol,mydf$myweight)) # different code same story 

pensé en escribir una función personalizada en lugar de utilizar weighted.mean y luego pasarla a ddply o incluso escribir algo nuevo desde cero con subconjunto. En mi caso, sería demasiado trabajo con suerte, pero debería haber una solución más inteligente con lo que ya está allí.

Gracias por cualquier sugerencia con anticipación!

Respuesta

17

utilizar una función anónima:

> ddply(iris,"Species",function(X) data.frame(wmn=weighted.mean(X$Sepal.Length, 
+                X$Petal.Length), 
+            mn=mean(X$Sepal.Length))) 
    Species  wmn mn 
1  setosa 5.016963 5.006 
2 versicolor 5.978075 5.936 
3 virginica 6.641535 6.588 
> 

Esto calcula una media ponderada de Sepal.Length (ponderado por Petal.Length), así como la media no ponderada y devuelve ambos.

+0

Esto es agradable. Hasta ahora no ha tenido mucho que ver con las funciones anónimas. parece realmente vale la pena echarle un vistazo. Todavía no entiendo la sintaxis/idea, pero lo investigaré, gracias por su ayuda. ¿Necesita imprimir todo en una línea porque no hay "{}" allí? ¿Dónde puedo aprender algo sobre las funciones anónimas? –

+1

Bueno, * todas * estas funciones '* apply',' by', ... usan funciones anónimas, por lo que debes encontrar muchos ejemplos. Las llaves se necesitan una vez que agrupas más de un comando. Por último, no tiene que utilizar una función anónima, sino que también puede definir la suya propia, pero al usarla se guarda al escribir :) –

+0

¿Qué pasa con 'lapply (split (iris, especie), weighted.mean)' o algo así? ? – aL3xa

20

Uso Resumir (o resumir):

ddply(iris, "Species", summarise, 
    wmn = weighted.mean(Sepal.Length, Petal.Length), 
    mn = mean(Sepal.Length)) 
+0

Cuando pruebo este formulario, obtengo 'Error en is.list (by): 'by' missing'. La salida del depurador es impenetrable. ¿Alguna pista de dónde vendría este error? ¿Alguien interesado en probar mis datos y la llamada 'ddply()'? –

+4

También recibo ese error en un código similar. El error ocurre solo en RStudio. Se debe a que 'Hmisc :: summarize' es más alto que' plyr :: ddply' en la lista 'search()'. [Ver este enlace] (https://groups.google.com/forum/?fromgroups=#!topic/manipulatr/DF__5YfwE68). Solucionarlo reemplazando 'summarize' con' summarise': funciona y no crea un conflicto con 'Hmisc'. Bienvenido al infierno de la dependencia! –

+6

O sea explícito y use 'plyr :: summarize' – hadley