【问题标题】:R expanding out a data.tableR扩展了data.table
【发布时间】:2014-04-29 23:16:00
【问题描述】:

我有以下情况。如下所示的data.table

x = data.table(
 id1 = c('a','b','c'),
 id2 = c('x','y','x'),
 val = c(0.2,0.3,0.5))

我还有另外两个数据表,它们给出了 id1 和 id2 中的值之间的映射,如下所示

id1.dt = data.table(
 id1 = c('a','a','a','b','b','c'),
 fid = c('1232','3224','3434','234','231','332')
)

和

id2.dt = data.table(
 id2 = c('x','x','y','y'),
 fid = c('334','443','344','24')
)

我想做的是通过保留values 列来扩展上述data.table x,这样我就可以得到一个完整的交叉连接,但是使用fid 列。所以预期的决赛桌是

id1 id2 val
1232 334 0.2
1232 443 0.2
3224 334 0.2
3224 443 0.2
3434 334 0.2
3434 443 0.2
...

基本上,对于x 中的每一行,我想从其他两个表中获取id1 和id2 的所有fid 值并保留val 值。我尝试过使用CJ,但并没有成功。任何帮助表示赞赏。

【问题讨论】:

    标签: r merge data.table


    【解决方案1】:

    有点尴尬,但应该这样做:

    setkey(x, id1)
    (setkey(x[id1.dt], id2))[
      id2.dt, allow.cartesian=T][
      order(val), -(1:2)
    ]
    

    生产:

        val  fid fid.1
     1: 0.2 1232   334
     2: 0.2 3224   334
     3: 0.2 3434   334
     4: 0.2 1232   443
     5: 0.2 3224   443
     6: 0.2 3434   443
     7: 0.3  234   344
     8: 0.3  231   344
     9: 0.3  234    24
    10: 0.3  231    24
    11: 0.5  332   334
    12: 0.5  332   443
    

    您也可以尝试merge.data.table 以更直观易懂的形式获得类似的结果:

    merge(
      merge(x, id1.dt, by="id1"), 
      id2.dt, by="id2", allow.cartesian=T
    )[, -(1:2)]
    

    【讨论】:

    • 我喜欢这两种解决方案,但尤其是这个 merge(merge( Nice!
    猜你喜欢
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 2022-12-20
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多