创建具有多个级别的摘要表

时间:2015-12-02 09:10:41

标签: r dplyr tabular

我有一个分类为高级别类别和低级别类别的数据。数据的基本结构与此模拟类似:

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,mean,sd等的表。我还尝试使用各种方法对group_by()等进行分组,但是无法在同一个表中使用两种分组方式。

我在想,或许有一种方法可以在循环过程中逐行或逐块地进行,但是我无法想象它是如何工作的。

有没有人见过这样的东西?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:-1)

您是否尝试过aggregate():

    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