【问题标题】:add missing rows to a data table将缺失的行添加到数据表
【发布时间】:2014-03-17 18:27:34
【问题描述】:

我有一个数据表:

library(data.table)
(f <- data.table(id1=c(1,2,3,1,2,3),
                 id2=as.factor(c("a","a","b","c","b","d")),
                 v=1:6,
                 key=c("id1","id2")))
   id1 id2 v
1:   1   a 1
2:   1   c 4
3:   2   a 2
4:   2   b 5
5:   3   b 3
6:   3   d 6
> str(f)
Classes ‘data.table’ and 'data.frame':  6 obs. of  3 variables:
 $ id1: num  1 1 2 2 3 3
 $ id2: Factor w/ 4 levels "a","b","c","d": 1 3 1 2 2 4
 $ v  : int  1 4 2 5 3 6
 - attr(*, "sorted")= chr  "id1" "id2"
 - attr(*, ".internal.selfref")=<externalptr> 

如何添加“缺失”行?

即,对于每个现有的 id1,我希望 id2 的所有可能值都存在(v=0)。

所以,我需要添加 6 行(id1 的 3 个可能值 * id2 的 4 个可能值 - 6 个现有行)。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我会得到id1id2 中的唯一值,并使用data.tablecross join 函数CJ 进行连接,如下所示:

    # if you've already set the key:
    ans <- f[CJ(id1, id2, unique=TRUE)][is.na(v), v := 0L][]
    
    # or, if f is not keyed:
    ans <- f[CJ(id1 = id1, id2 = id2, unique=TRUE), on=.(id1, id2)][is.na(v), v := 0L][]
    
    ans
    

    【讨论】:

      【解决方案2】:
      f[, {
        tab = table(id2)
        x = as.numeric(tab)
        x[x != 0] = v
        list(id2 = names(tab), v = x)
      }, by = id1]
      
      ##    id1 id2 v
      ##  1:   1   a 1
      ##  2:   1   b 0
      ##  3:   1   c 4
      ##  4:   1   d 0
      ##  5:   2   a 2
      ##  6:   2   b 5
      ##  7:   2   c 0
      ##  8:   2   d 0
      ##  9:   3   a 0
      ## 10:   3   b 3
      ## 11:   3   c 0
      ## 12:   3   d 6
      

      【讨论】:

        猜你喜欢
        • 2021-03-16
        • 2018-06-19
        • 1970-01-01
        • 2014-03-29
        • 2018-03-02
        • 2022-01-25
        • 2013-10-19
        • 1970-01-01
        • 2021-10-05
        相关资源
        最近更新 更多