2012-11-29 126 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)