【问题标题】:rbind and join in data.tablerbind 并加入 data.table
【发布时间】:2019-07-15 16:31:58
【问题描述】:

我需要rbind(.) 两个data.tables,其中一个比另一个多两列。我想绑定它们但也填充列。

d1 <- data.table(group=rep(1:2,each=5), no=1:5, x= rep(c(100,200), each=5), y=rnorm(10))
d2 <- data.table(group=rep(1:2,each=2), y=rnorm(4))

> rbind(d1,d2,fill=TRUE)
    group no   x            y
 1:     1  1 100  0.018938699
 2:     1  2 100 -1.924350449
 3:     1  3 100  0.331769790
 4:     1  4 100 -0.007978624
 5:     1  5 100 -0.216864548
 6:     2  1 200 -0.959552464
 7:     2  2 200 -0.878798805
 8:     2  3 200 -0.671132161
 9:     2  4 200 -1.329565254
10:     2  5 200  0.795662872
11:     1 NA  NA  0.312083392
12:     1 NA  NA -0.485818453
13:     2 NA  NA  1.848410165
14:     2 NA  NA  1.476295328

最重要的是,x 列的缺失值应以与同一组中的所有其他人相同的方式填充。如果可能,no 列的缺失值应继续。这可能在data.table中吗?它似乎是绑定和加入的某种混合,我不知道该怎么做。

【问题讨论】:

    标签: r join data.table bind


    【解决方案1】:

    您可以通过 rbind 输出上的一些组操作来做到这一点

    out <- 
      rbind(d1, d2, fill = T)[, `:=`(no = 1:.N, x = x[!is.na(x)][1]), by = group]
    
    out
    #     group no   x           y
    #  1:     1  1 100  0.54925252
    #  2:     1  2 100  1.10898571
    #  3:     1  3 100 -0.06352423
    #  4:     1  4 100 -0.39246382
    #  5:     1  5 100 -0.06599473
    #  6:     2  1 200 -0.92048106
    #  7:     2  2 200 -0.45606083
    #  8:     2  3 200 -1.12622400
    #  9:     2  4 200  0.54906549
    # 10:     2  5 200  1.11150729
    # 11:     1  6 100 -2.03593356
    # 12:     1  7 100 -0.22070918
    # 13:     2  6 200 -0.48830888
    # 14:     2  7 200 -1.36497717
    

    您也可以通过连接来执行此操作(相同的输出)

    rbind(d1, d2[d1, on = 'group', `:=`(x = i.x, no = max(i.no))][, no := no + rowid(group)])
    

    【讨论】:

    • 你的第一种方式没有 by= 分组:setorder(rbind(d1, d2, fill=TRUE), group)[, `:=`(no = rowid(group), x = nafill(x, "locf"))][] 我认为 nafill 可能需要开发版本。
    • 是的,刚刚检查过,nafill 在开发 1.12.3 中。很高兴听到,但我不知道 data.table 正在获得nafill 函数!现在,如果我能得到coalesce,我真的可以从一些脚本中删除一些包。编辑:开发中也有一个coalesce!哇!
    猜你喜欢
    • 1970-01-01
    • 2014-12-05
    • 2018-12-02
    • 1970-01-01
    • 2013-02-07
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多