0

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

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 中执行此操作吗?

4

1 回答 1

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

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

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)
于 2013-11-13T16:30:36.493 回答