2016-01-14 72 views
0

使用以下數據集計算加權平均值和Val2對於每個「類別」使用列Wt列的權重來計算加權平均值。R使用ddply應用

數據:

Category,Details,Wt,Val1,Val2 
A,Apple,8,3.0,12 
A,Apple Gala,30,4.3,8 
B,Banana,9,5.7,4 
B,Banana Ripe,12,7.3,0 
B,Banana Green,16,9.0,-4 
C,Cantaloupe,4,10.9,-8 
C,Carrot,86,13.0,-12 
C,Cane,92,15.3,-16 

希望通過此來完成這個..

ddply (data, .(Category), summarize, function (y) { 
apply(y[,4:5],2,function(x) sum (x*Wt/sum(Wt))} 
) 

實際數據集是大得多。

+1

做過那個工作嗎?你也可以做'library(dplyr); df%>%group_by(Category)%>%summarise_each(funs(sum(。* Wt/sum(Wt))),Val1:Val2)' –

+1

不知道如果我們關閉這個http://stackoverflow.com/questions/ 7148598 /如何總結數據 - 按組加權平均數 –

+0

是的,請關閉它。 –

回答

2

你不需要apply裏面ddply(好吧,如果你使用summarize,它期望你定義個別的新列)。

ddply(data, .(Category), summarize, 
     m1 = weighted.mean(Val1, Wt), 
     m2 = weighted.mean(Val2, Wt)) 

如果您擔心效率問題,那麼您應該升級到dplyr。語法是在這種情況下很相似:

library(dplyr) 
data %>% group_by(Category) %>% 
    summarize(
     m1 = weighted.mean(Val1, Wt), 
     m2 = weighted.mean(Val2, Wt) 
    ) 

或者,如果你有更多的列你可以用大衛Arenburg的評論,使之擴大。

+0

謝謝你們兩位。這對我來說。現在我正在使用Gregor的解決方案。 –