根据R中的聚合值生成表

时间:2013-11-13 16:28:05

标签: r sum dataframe aggregate

我有一个以下格式的数据框,我想根据聚合值得到表格:

VALUE   Time1   Time2
   1    NN  NF
   2    FF  FF
   7    NF  FF
   4    NN  NN
   3    NN  FF
   3    NF  NF
   5    NF  NF
   6    FF  FF

我可以使用 table()函数

创建一个简单的表
 table(Time1,Time2)

这给了我以下输出

     FF FN  NF  NN  Total
 FF  2  0   0   0    2
 FN  0  0   0   0    0
 NF  1  0   2   0    3

Total 3 0   2   0    5

我希望根据 VALUE 列的总和对上述数据框进行交叉制表。我可以使用 sumif 函数在Excel中执行此操作并获得以下输出。

    FF  FN  NF  NN  Total
 FF 8   0   0   0   8
 FN 0   0   0   0   0
 NF 7   0   8   0   15
 NN 3   0   1   4   8
 Total  18  0   9   4   31

我需要帮助才能在R中执行此操作?

1 个答案:

答案 0 :(得分:4)

对于sum的情况,您可以使用xtabs。在这里,我将其包装在addmargins中以获得总数:

addmargins(xtabs(VALUE ~ Time1 + Time2, mydf))
#      Time2
# Time1 FF NF NN Sum
#   FF   8  0  0   8
#   NF   7  8  0  15
#   NN   3  1  4   8
#   Sum 18  9  4  31

更一般地说,您可能希望从“reshape2”中查看dcast

library(reshape2)
dcast(mydf, Time1 ~ Time2, value.var="VALUE", fun.aggregate=sum, margins=TRUE)
#   Time1 FF NF NN (all)
# 1    FF  8  0  0     8
# 2    NF  7  8  0    15
# 3    NN  3  1  4     8
# 4 (all) 18  9  4    31

要解决@ SimonO101的问题,如果数据被正确分解,那么默认情况下所有级别都会显示xtabs方法。但是,您需要使用drop = FALSE版本指定dcast

获取上述数据(由于它不包含“FN”的“Time1”或“Time2”),让这些列factor并看看它如何改变输出:

mydf[-1] <- lapply(mydf[-1], function(x) factor(x, c("FF", "FN", "NF", "NN")))
addmargins(xtabs(VALUE ~ Time1 + Time2, mydf))
#      Time2
# Time1 FF FN NF NN Sum
#   FF   8  0  0  0   8
#   FN   0  0  0  0   0
#   NF   7  0  8  0  15
#   NN   3  0  1  4   8
#   Sum 18  0  9  4  31

如上所述,dcast等价物将是:

dcast(mydf, Time1 ~ Time2, value.var="VALUE", 
      fun.aggregate=sum, margins=TRUE, drop=FALSE)