R - 在重塑data.frame之前添加缺少的观察结果

时间:2017-01-15 13:51:08

标签: r dataframe reshape

假设我有以下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,并且在每种情况下缺失的观察结果完全不同,你能否让我了解如何实现这一目标?

0 个答案:

没有答案