2015-12-02 79 views
1

我有一個數據分爲高級類別和低級別類別。該數據也有類似的這種模擬一個基本結構:創建多個級別的彙總表

set.seed(21) 
cat <- data.frame(Level1=c(rep("A",6),rep("B",6),rep("C",6)), 
        Level2=c(sample(c(1:3), 6, replace=TRUE), 
          sample(c(4:6), 6, replace=TRUE), 
          sample(c(7:9), 6, replace=TRUE)), 
        Type=rep(c(1,2),9), 
        Value=rnorm(18)) 

> table(cat$Level1,cat$Level2) 

    # 1 2 3 4 5 6 7 8 9 
    #A 1 3 2 0 0 0 0 0 0 
    #B 0 0 0 1 1 4 0 0 0 
    #C 0 0 0 0 0 0 1 4 1 

如果可能的話,我想創建一個具有兩個Level1和Level2計數和手段(或其他摘要)表,在層次結構如下:

#Level1/2 Count  Mean  SD ... whatever 
#A    6  0.15323278 
# 1   1 -0.5821507 
# 2   3  0.8603706 
# 3   2 -0.5397822 
#B    6  0.46460457 
# 4   1  1.0136847 
# 5   1 -0.3521069 
# 6   4  0.5315124... 

我試過tabular()tables包 - 它可以很好地創建一個表,其中n,平均值,SD等基於更高級別的分組。我也嘗試了使用group_by()等不同的分組方法進行彙總,但是無法用兩種方法在同一個表中進行分組。

我在想,也許有一種方法可以在循環過程中逐行執行或(逐塊執行),但我無法完全設想這將如何工作。

有沒有人見過這樣的事?

回答

5

執行兩次摘要統計並將結果添加到一個表中。例如,使用data.table

require(data.table) 

set.seed(21) 

cat <- data.table(Level1=c(rep("A",6),rep("B",6),rep("C",6)), 
        Level2=c(sample(c(1:3), 6, replace=TRUE), 
          sample(c(4:6), 6, replace=TRUE), 
          sample(c(7:9), 6, replace=TRUE)), 
        Type=rep(c(1,2),9), 
        Value=rnorm(18)) 
cat 

table(cat$Level1, cat$Level2) 

# Statistics for Level1 
tab1 <- cat[, .(Count = .N, Mean = mean(Value), SD = sd(Value)), 
      keyby = .(Level1)] 

# Statistics for Level1 and Level2 
tab2 <- cat[, .(Count = .N, Mean = mean(Value), SD = sd(Value)), 
      keyby = .(Level1, Level2)] 

# Add in one table 
tab <- rbindlist(list(tab2, tab1), fill = TRUE) 

# Sort 
setorder(tab, Level1, Level2) 

# Print 
tab 

結果:

> tab 
    Level1 Level2 Count  Mean  SD 
1:  A  NA  6 -0.2224609 1.1052424 
2:  A  1  2 -1.4125934 1.2221462 
3:  A  3  4 0.3726054 0.3487678 
4:  B  NA  6 0.4125892 0.8841718 
5:  B  4  2 1.0854216 0.6030156 
6:  B  6  4 0.0761730 0.8538268 
7:  C  NA  6 -0.2347908 0.7815174 
8:  C  7  4 -0.2805626 0.6948971 
9:  C  8  2 -0.1432472 1.2570046 
+0

這是一個完美的解決方案。感謝您及時的回覆! –

-1

你試過骨料():

set.seed(21) 

    cat <- data.table(Level1=c(rep("A",6),rep("B",6),rep("C",6)), 
       Level2=c(sample(c(1:3), 6, replace=TRUE), 
         sample(c(4:6), 6, replace=TRUE), 
         sample(c(7:9), 6, replace=TRUE)), 
       Type=rep(c(1,2),9), 
       Value=rnorm(18)) 

    aggregate(Value~Level1+Level2, data=cat, FUN=mean) 

結果:

  Level1 Level2  Value 
    1  A  1 -1.4125934 
    2  A  3 0.3726054 
    3  B  4 1.0854216 
    4  B  6 0.0761730 
    5  C  7 -0.2805626 
    6  C  8 -0.1432472 
+0

這不是所需的輸出,不是嗎? –