假设我有以下data.frame
:
test <- data.frame(id = c(rep(1,6), rep(2,3)),
monthYear = c("Dec16","Nov16","Oct16","Dec16","Nov16","Oct16","Dec16","Nov16","Dec16"),
color = c(rep("black", 4),rep("red",2),rep("black", 2),"red"),
quantity = c(1:9))
导致此data.frame:
> test
id monthYear color quantity
1 1 Dec16 black 1
2 1 Nov16 black 2
3 1 Oct16 black 3
4 1 Dec16 black 4
5 1 Nov16 red 5
6 1 Oct16 red 6
7 2 Dec16 black 7
8 2 Nov16 black 8
9 2 Dec16 red 9
对于每个unique id
,我需要按color
创建monthYear
的子集,其中每个月的年份都作为新列放置,并相应地汇总数量:
library("reshape")
for (i in unique(test$id)) {
subsetTest <- aggregate(cbind(quantity) ~ monthYear + color,
data = test[test$id==i,],
sum)
subsetTestColumns <- reshape(subsetTest,
timevar=as.character("monthYear"),
idvar="color",
direction="wide")
names(subsetTestColumns)[-1]<-as.character(unique(subsetTest$monthYear))
subsetTestColumns[is.na(subsetTestColumns)]<-0
# Reorder by column name (just in case)
subsetTestColumns[c("color", "Dec16", "Nov16","Oct16")]
### Do something with the resulting data.frame
}
对于第一个Id,输出符合预期:
> subsetTestColumns
color Dec16 Nov16 Oct16
1 black 5 2 3
4 red 0 5 6
然而,loop
因id = 2而失败,因为没有完整的情况(Oct16根本不存在)。请注意,结果data.frame的结构必须完全是[color,Dec16,Nov16,Oct16]
我可能会检查(在命名monthYear列之前)是否全部三个 monthYears存在,如果不存在,则手动创建它们。但不知何故,我对这种方式感到不舒服。
我认为,防止错误的最佳方法是添加零数量的缺失观察值。因此,在使用subsetTest
函数创建aggregate
data.frame后,我得到以下id = 2的结构:
monthYear color quantity
1 Dec16 black 7
2 Nov16 black 8
3 Dec16 red 9
在我看来,Oct16增加了0个数量,11月16日和Oct16增加了0个红色似乎是解决问题的更合理的方法。考虑到原始数据有超过100个ID,并且在每种情况下缺失的观察结果完全不同,你能否让我了解如何实现这一目标?