2010-07-18 96 views
9

我想在R中做一個「group by」 - 樣式加權平均值。有了一些基本的意思,下面的代碼(使用Hadley的plyr包)運行良好。group by R,ddply with weighted.mean

ddply(mydf,.(period),mean) 

如果我用weighted.mean我得到以下錯誤「‘x’和‘W’必須具有相同的長度」,這一點我不明白,因爲weighted.mean部分以外的作品同樣的方法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 

我想編寫自定義函數,而不是使用weighted.mean,然後把它傳遞給ddply甚至寫新的東西從頭與子集。就我而言,希望工作太多,但應該有一個更聰明的解決方案,以及已有的東西。

thx任何建議提前!

回答

17

使用匿名功能:

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

此計算Sepal.Length的加權平均值(按Petal.Length加權)以及未加權平均值,並返回兩者。

+0

這是很好的。到目前爲止,還沒有很多與匿名功能有關。看起來很值得一看。我還沒有完全得到語法/想法,但我會研究它,thx尋求幫助!您是否需要在一行中打印所有內容,因爲那裏沒有「{}」?我可以在哪裏瞭解有關匿名功能的內容? – 2010-07-18 21:50:44

+1

那麼,*所有*這些'* apply','by',...函數使用匿名函數,所以你應該找到大量的例子。一旦您將多個命令組合在一起,就需要花括號。最後,你沒有使用一個匿名函數 - 你也可以定義你自己的 - 但使用它們可以節省輸入:) – 2010-07-18 22:03:00

+0

'lapply(split(iris,species),weighted.mean)'或者那樣的? – aL3xa 2010-07-18 23:27:32

20

使用總結(或總結):

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

當我嘗試這個表單時,我得到'錯誤in.list(by):'by'缺少'。調試器輸出是難以理解的。任何線索哪裏會出現這個錯誤?任何有興趣嘗試我的數據和'ddply()'調用? – 2012-07-02 16:27:07

+4

我在類似的代碼上也得到了這個錯誤。該錯誤僅在RStudio中發生。這是由於在'search()'列表中'Hmisc :: summarize'高於'plyr :: ddply'。 [請參閱此鏈接](https://groups.google.com/forum/?fromgroups=#!topic/manipulatr/DF__5YfwE68)。通過用'summarise'替換'summarize'解決它:它工作並且不會與'Hmisc'產生衝突。歡迎來到依賴地獄! – 2013-04-11 19:48:53

+6

或者明確並使用'plyr :: summarize' – hadley 2013-04-11 22:51:02