2012-11-29 94 views
1

行如果我有一个DF:巩固分类

> ID<-c("A","A","A","B","B","B","B","C","C","C","C") 
> attr<-c("yes1","yes1","no","yes2","yes1","yes1","yes1","no","no","yes1","yes2") 
> df = data.frame(ID, attr) ; df 
    ID attr 
1 A yes1 
2 A yes1 
3 A no 
4 B yes2 
5 B yes1 
6 B yes1 
7 B yes1 
8 C no 
9 C no 
10 C yes1 
11 C yes2 

随着成千上万的ID。我想补充一点,输出的每个ID "yes"属性的百分比的另一列,以及如果有只有一个"no" ATTR:

 ID %yes #no 
1  A 66.7  1 
2  B  100  0 
3  C  50  2 

有没有办法来巩固行,如同对SQL GROUP BY?最终,这个新的DF将分类标识,并加入到原来的DF:

 ID attr result 
1  A yes1  Pos 
2  A yes1  Pos 
3  A  no  False 
4  B yes2 TruePos 
5  B yes1 TruePos 
6  B yes1 TruePos 
7  B yes1 TruePos 
8  C  no  False 
9  C  no  False 
10 C yes1  Pos 
11 C yes2  Pos 

回答

3

看看在data.table包:

加载包装并将data.frame转换为data.table。使用key=指定您的分组列。

library(data.table) 
DT <- data.table(df, key="ID") 

执行聚合。

DT2 <- DT[, list(pct = length(grep("yes", attr))/length(attr), 
       no = sum(attr == "no")), by=key(DT)] 
DT2 
# ID  pct no 
# 1: A 0.6666667 1 
# 2: B 1.0000000 0 
# 3: C 0.5000000 2 
+0

我碰到过几次data.table,现在我必须阅读文档。似乎它拥有一切! – stites

+1

我今天刚刚阅读了'data.table'的介绍和FAQ。虽然基本的想法听起来很棒,但是我在新版本中改变了一些东西,这让我略微感到厌烦。我不一定是向后兼容的忠实粉丝,但看起来今天的R脚本是否可以与明天的'data.table'版本一起工作似乎有点冒险。 –

+1

@StephanKolassa,开发者在这里非常活跃,所以我觉得......很安慰。我发现,对于大量的聚合问题,它速度非常快,而且语法并不太难拾取。你被推迟了什么样的改变? – A5C1D2H2I1M1N2O1R2T1

2

这会给你的“是”每个ID级别比例:

by(substr(df$attr,1,3)=="yes",INDICES=df$ID,FUN=mean) 

这会告诉你多少每个ID级别 “无” 条目:

by(df$attr=="no",INDICES=df$ID,FUN=sum)