【问题标题】:Efficiently inserting default missing rows in a data.table在 data.table 中有效插入默认缺失行
【发布时间】:2013-05-13 09:14:52
【问题描述】:

假设我有以下data.table

dt <- data.table(id=c(1,1,1,1,1,1,2,2,2,2),
           wday=c("mon","tue","wed","thu","fri","sat","mon","tue","thu","fri"),
           val=c(2,3,5,8,6,2,3,4,2,6))

    id wday val
 1:  1  mon   2
 2:  1  tue   3
 3:  1  wed   5
 4:  1  thu   8
 5:  1  fri   6
 6:  1  sat   2
 7:  2  mon   3
 8:  2  tue   4
 9:  2  thu   2
10:  2  fri   6

这是另一个data.table 聚合的结果。它表示变量的计数 (val),具体取决于不同个体 (id) 的工作日 (wday)。问题是,在我的操作中,我失去了计数为 0 的工作日。

所以问题是:如何通过为每个 id 插入与 val=0 缺失的工作日一样多的行来有效地更新我的 data.table 对象?

结果如下:

    id wday val
 1:  1  mon   2
 2:  1  tue   3
 3:  1  wed   5
 4:  1  thu   8
 5:  1  fri   6
 6:  1  sat   2
 7:  1  sun   0
 8:  2  mon   3
 9:  2  tue   4
10:  2  wed   0
11:  2  thu   2
12:  2  fri   6
13:  2  sat   0
14:  2  sun   0

非常感谢您的帮助。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我现在能想到的一种直接方法是使用expand.grid 获取所有组合,然后使用它与allow.cartesian = TRUE 进行子集化:

    setkey(dt, "id", "wday")
    vals <- c("mon", "tue", "wed", "thu", "fri", "sat", "sun")
    idx <- expand.grid(vals, unique(dt$id))[, 2:1]
    dt[J(idx), allow.cartesian=TRUE]
    
    #     id wday val
    #  1:  1  mon   2
    #  2:  1  tue   3
    #  3:  1  wed   5
    #  4:  1  thu   8
    #  5:  1  fri   6
    #  6:  1  sat   2
    #  7:  1  sun  NA
    #  8:  2  mon   3
    #  9:  2  tue   4
    # 10:  2  wed  NA
    # 11:  2  thu   2
    # 12:  2  fri   6
    # 13:  2  sat  NA
    # 14:  2  sun  NA
    

    或者,可以直接用CJ构建idx数据表:

    dt[CJ(unique(dt$id),vals), allow.cartesian=TRUE]
    

    【讨论】:

    • 非常感谢@Arun!我只是稍微编辑了您的答案,以提及使用CJ 而不是expand.grid 的可能性。随意保留、删除或修改它。
    • 哦,是的,确实@juba,太棒了!我有一段时间没用过了……也谢谢你提醒我。
    【解决方案2】:

    match 和 ddply 的另一种可能性:

    FUN <- function(x) {
    y <- x$val[match(c("mon", "tue", "wed", "thu", "fri", "sat", "sun"), x$wday, nomatch=NA)]
    y[is.na(y)] <- 0
    y <- data.frame(wday=c("mon", "tue", "wed", "thu", "fri", "sat", "sun"), val=y)
    y
    }
    ddply(dt, .(id), FUN)
    

    【讨论】:

    • 感谢plyr 解决方案。我想我会接受data.table 的那个,但是这个也很好用。
    猜你喜欢
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多