2010-07-18 9 views
9

Ich versuche, eine "Gruppe von" - Stil gewichtet Mittel in R zu tun. Mit einigen grundlegenden bedeutet der folgende Code (mit dem Plyr-Paket von Hadley) hat gut funktioniert.Gruppe von in R, ddply mit weighted.mean

ddply(mydf,.(period),mean) 

Wenn ich den gleichen Ansatz mit weighted.mean bekomme ich folgende Fehlermeldung „‚x‘und‚w‘müssen die gleiche Länge haben“, die ich nicht verstehe, weil der weighted.mean Teil arbeitet außerhalb 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 

Ich dachte an eine benutzerdefinierte Funktion statt mit weighted.mean schreiben und dann übergeben Sie etwas Neues von Grund auf neu ddply oder auch mit Teilmenge zu schreiben. In meinem Fall wäre es hoffentlich zu viel Arbeit, aber es sollte durch eine klügere Lösung mit dem was schon da ist.

thx für irgendwelche Vorschläge im Voraus!

Antwort

17

eine anonyme Funktion verwenden:

> 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 
> 

Dies berechnet einen gewichteten Mittelwert von Sepal.Length (durch Petal.Length gewichtet) sowie ungewichtete Mittelwert und beide zurückgibt.

+0

Das ist schön. Haven't hatte bisher viel mit anonymen Funktionen zu tun. scheint wirklich einen Blick wert. Ich verstehe die Syntax/Idee noch nicht vollständig, aber ich werde es mir anschauen, Danke für Ihre Hilfe! Müssen Sie alles in einer Zeile drucken, weil dort kein "{}" steht? Wo kann ich etwas über anonyme Funktionen lernen? –

+1

Nun, * all * diese '' apply', 'by', ... Funktionen verwenden anonyme Funktionen, so dass Sie viele Beispiele finden sollten. Curly geschweifte Klammern werden benötigt, wenn Sie mehr als einen Befehl gruppieren. Schließlich haben Sie keine anonyme Funktion - Sie können auch Ihre eigenen definieren - aber mit ihnen spart beim Tippen :) –

+0

was ist mit 'lapply (split (Iris, Arten), gewichtete.Mean)' oder etw so ? – aL3xa

20

Verwendung summarize (oder zusammenfassen):

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

Wenn ich dieses Formular versuche, bekomme ich 'Fehler in is.list (von): 'durch' fehlt '. Der Debugger-Ausgang ist undurchdringlich. Irgendwelche Hinweise, woher dieser Fehler kommen könnte? Wer möchte meine Daten ausprobieren und 'ddply()' anrufen? –

+4

Ich bekomme diesen Fehler auch auf ähnlichen Code. Der Fehler tritt nur in RStudio auf. Es liegt daran, dass 'Hmisc :: summarize' in der' search() 'Liste höher ist als' plier :: ddply'. [Siehe diesen Link] (https://groups.google.com/forum/?fromgroups=#!topic/manipulatr/DF__5YfwE68). Repariere es, indem du "summarize" durch "summarise" ersetzt: es funktioniert und erzeugt keinen Konflikt mit 'Hmisc'. Willkommen in der Abhängigkeit der Hölle! –

+6

Oder seien Sie explizit und verwenden Sie 'plyr :: summarize' – hadley