我有一个以下格式的数据框,我想根据聚合值得到表格:
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中执行此操作?
答案 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)