2013-02-21 44 views
7

我試圖在數據幀的子集內獲得比例。例如,在這個虛構的數據幀:計算數據幀子集內的比例

DF<-data.frame(category1=rep(c("A","B"),each=9), 
    category2=rep(rep(LETTERS[24:26],each=3),2), 
    animal=rep(c("dog","cat","mouse"),6),number=sample(18)) 

我想喜歡由category2組合(例如,指出均爲「A中的所有動物,以計算每個三隻動物中的每個category1比例「和」X「,狗的比例是多少?)。與數據幀第4列prop.table我可以得到的比例,每行組成的總數「列」,但我還沒有找到一種方法來做這個基於類別1和2的子集。我也試過分裂通過category1category2數據使用此:

splitDF<-split(DF,list(DF$category1,DF$category2)) 

而且我希望那時我能應用功能與prop.table讓每個分割組內每個動物的比例,但我不能讓prop.table工作,因爲我可以」 t似乎指定將哪個數據列應用於拆分組中。有沒有人有任何提示?也許這可能與plyr或類似的東西?我無法在幫助論壇中找到任何有關範圍內數據子集的方法。

回答

6

您可以使用功能ddply()從庫plyr計算每個組合的比例,然後添加新列的數據幀。

library(plyr)  
DF<-ddply(DF,.(category1,category2),transform,prop=number/sum(number)) 
DF 
    category1 category2 animal number  prop 
1   A   X dog  17 0.44736842 
2   A   X cat  3 0.07894737 
3   A   X mouse  18 0.47368421 
4   A   Y dog  2 0.14285714 
+0

這是非常好的,乾淨。非常感謝,Didzis! plyr似乎是解決了很多這類問題的,但它帶我一段時間來習慣它! – user2093526 2013-02-21 18:41:28

3

這是否會產生您想要的輸出?

DF$proportion<-as.vector(unlist(tapply(DF$number,paste(DF$category1,DF$category2,sep="."),FUN=function(x){x/sum(x)}))); 
+0

是的,它的確如此(正如Didzis的使用plyr的答案)。非常感謝您的幫助! – user2093526 2013-02-21 18:40:14