【问题标题】:R: Dealing with time mismatches while using data.tableR:在使用 data.table 时处理时间不匹配
【发布时间】:2014-06-11 23:34:54
【问题描述】:

嘿,我正在尝试从使用 ddply 过渡到使用 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

我想找出产品 i 在第 j 周的总销售额,即我在第一周销售了 25 件产品 a。

我使用以下代码来做到这一点:

    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 中执行此操作,但我无法通过搜索找到我要查找的内容。如果有人可以帮助我或将我链接到正确的页面(如果这是重复的),那就太好了。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    您可以通过以下方式按独特产品和所有周交叉加入,然后对每个组求和。

    > 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 版本 &lt;= 1.9.2,则只需删除 by = .EACHI 部分。这是从下一个版本开始的新设计更改(目前在 1.9.3 开发中实现)。查看NEWS 了解更多信息。

    【讨论】:

    • 完美!这正是我的想法,不知道有交叉连接。
    【解决方案2】:

    也许重塑是另一种选择:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-23
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-11
      • 1970-01-01
      • 2012-05-23
      相关资源
      最近更新 更多