2014-06-11 23 views
1

嘿我试图从使用ddply过渡到使用data.table,我近在琢磨,但我有轻微的调整,我仍然需要使。下面是我想要做的事情的概要,使用玩具数据集:R:处理时间不匹配,同时使用data.table

比方说,我有两个产品的销售数据为多个星期。

x <- structure(list(week = c(1, 1, 2, 3, 1, 2, 2, 3, 4), product = c("a", 
    "a", "a", "a", "b", "b", "b", "b", "b"), sold = c(10, 15, 20, 
    25, 30, 35, 40, 45, 50)), .Names = c("week", "product", "sold" 
    ), row.names = c(NA, -9L), class = c("data.table", "data.frame" 
    ), sorted = c("product", "week")) 

     week product sold 
    1: 1  a 10 
    2: 1  a 15 
    3: 2  a 20 
    4: 3  a 25 
    5: 1  b 30 
    6: 2  b 35 
    7: 2  b 40 
    8: 3  b 45 
    9: 4  b 50 

我想找到产品的总销售额为我每周Ĵ,即我卖了25个单位产品的一个一周1

我用下面的代码来做到这一点:

setDT(x) 
    setkey(x,product,week) 
    > x1 <- x[x,sum(sold)] 
    > x1 
     product week V1 
    1:  a 1 25 
    2:  a 1 25 
    3:  a 2 20 
    4:  a 3 25 
    5:  b 1 30 
    6:  b 2 75 
    7:  b 2 75 
    8:  b 3 45 
    9:  b 4 50 

问题是我不知道如何删除重复的行,即。第2行是多余的。此外,我还想在产品未销售的周内纳入NA,即。第4周产品的一行值为NA。

我敢肯定这是一个简单的问题,我知道如何在ddply中做到这一点,但我找不到通过搜索找到的东西。如果任何人都可以帮助或链接到正确的页面,如果这是重复的,那会很好。

回答

3

以下介绍如何通过独特的产品和所有星期交叉加入,然后汇总每个组。

> x[CJ(unique(product), 1:4), sum(sold), by=.EACHI] 
    product week V1 
1:  a 1 25 
2:  a 2 20 
3:  a 3 25 
4:  a 4 NA 
5:  b 1 30 
6:  b 2 75 
7:  b 3 45 
8:  b 4 50 

如果您使用data.table版本<= 1.9.2,则只是删除by = .EACHI部分。这是来自下一版本的新设计变更(目前在1.9.3版本中实施)。查看NEWS了解更多信息。

+0

完美!这正是我所想的,不知道是否有交叉连接。 – user3732080

0

重塑或许是另一种选择:

require(reshape2); require(data.table) 
(dt2 <- dcast.data.table(dt, product ~ week, fun.aggregate = sum, value.var = "sold", fill = NA, drop = FALSE)) 
# product 1 2 3 4 
# 1:  a 25 20 25 NA 
# 2:  b 30 75 45 50 
(dt3 <- melt(dt2, id.vars = "product", variable.name = "week", value.name = "sold")) 
# product week sold 
# 1:  a 1 25 
# 2:  b 1 30 
# 3:  a 2 20 
# 4:  b 2 75 
# 5:  a 3 25 
# 6:  b 3 45 
# 7:  a 4 NA 
# 8:  b 4 50