2013-02-21 41 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