2014-01-06 49 views
2

我想總結或彙總表而不刪除空的水平。我想知道有沒有人對此有任何想法?摘要/彙總中的R沒有下降的水平

作爲一個例子,在這裏 是數據幀使用鹼和doBy

df1<-data.frame(Method=c(rep("A",3),rep("B",2),rep("C",4)), 
     Type=c("Fast","Fast","Medium","Fast","Slow","Fast","Medium","Slow","Slow"), 
      Measure=c(1,1,2,1,3,1,1,2,2)) 

兩種方法。

#base 
aggregate(Measure~Method+Type,data=df1,FUN=length) 

require(doBy) 
summaryBy(Measure~Method+Type,data=df1,FUN=length) 

他們都給予不同的排序相同的結果,但問題是,我想插入爲來港失蹤的措施方法和類型的所有組合。或者我的兩個因素都必須保持不變。

df1$Type 
df1$Method 

也許plyr有東西,但我不知道那是如何工作的。

+1

看到[與data.table類似的問題](http://stackoverflow.com/questions/20914284/including-all-permutations-when-using-data-table-by) – BrodieG

+3

另請參閱'ddply'和它的' .drop'參數。 – joran

+2

由於@joran已經說過了,但是因爲您對plyr不熟悉:'ddply(df1,。(Method,Type),summary,Measure = length(Measure),.drop = F)' –

回答

0

感謝您的回答。我認爲他們所有人都有效果。但是,馬克用的Heckmann這段代碼

ddply(df1, .(Method, Type), summarise, Measure=length(Measure), .drop=F)

的評論似乎給一個乾淨的輸出數據幀具有良好的頭和用最少的代碼。缺點是,它需要額外的軟件包。

4

看一看tapply

with(df1, tapply(Measure, list(Method, Type), FUN = length)) 

# Fast Medium Slow 
# A 2  1 NA 
# B 1  NA 1 
# C 1  1 2 
1

在基礎R,by會返回一個結果缺失值。

result <- by(df1, INDICES=list(df1$Method, df1$Type), FUN=nrow) 
cbind(expand.grid(attributes(result)$dimnames), as.vector(result)) 

# Var1 Var2 as.vector(result) 
# 1 A Fast     2 
# 2 B Fast     1 
# 3 C Fast     1 
# 4 A Medium     1 
# 5 B Medium    NA 
# 6 C Medium     1 
# 7 A Slow    NA 
# 8 B Slow     1 
# 9 C Slow     2 
1

你可以嘗試by()在基地R.例如,

tab <- with(df1, by(df1, list(Method = Method, Type = Type), FUN = length)) 
Method: A 
Type: Fast 
[1] 2 
------------------------------------------------------------  
Method: B 
Type: Fast 
[1] 1 
------------------------------------------------------------  
Method: C 
Type: Fast 
[1] 1 
------------------------------------------------------------  
Method: A 
Type: Medium 
[1] 1 
------------------------------------------------------------  
Method: B 
Type: Medium 
[1] NA 
------------------------------------------------------------  
Method: C 
Type: Medium 
[1] 1 
------------------------------------------------------------  
Method: A 
Type: Slow 
[1] NA 
------------------------------------------------------------  
.... 

注意,這僅僅是print()方法使它看起來複雜。如果我們unclass()tab,我們看到它是在這種情況下多路表:

R> unclass(tab) 
     Type 
Method Fast Medium Slow 
    A 2  1 NA 
    B 1  NA 1 
    C 1  1 2 
attr(,"call") 
by.data.frame(data = df1, INDICES = list(Method = Method, Type = Type), 
    FUN = nrow) 

,您可以與工作,因爲它只是一個數組(矩陣)。如果您偏好長格式,可以輕鬆展開:

nr <- nrow(tab) 
ltab <- cbind.data.frame(Method = rep(rownames(tab), times = nr), 
         Type = rep(colnames(tab), each = nr), 
         Count = c(tab)) 
ltab 

R> ltab 
    Method Type Count 
1  A Fast  2 
2  B Fast  1 
3  C Fast  1 
4  A Medium  1 
5  B Medium NA 
6  C Medium  1 
7  A Slow NA 
8  B Slow  1 
9  C Slow  2 
+1

不要挑剔,但是你要返回每個分組的列數,而不是觀察次數。 –

+0

@MatthewPlourde感謝馬修,我只是想表明,我不應該在這裏回答問題,也可以在twitter上同時做所有工作......! –