R扩展了data.table

时间:2014-04-29 23:16:01

标签: r merge data.table

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

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

我还有两个其他数据表,可以在id1id2中的值之间进行映射,如下所示

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')
)

我希望能够做的是通过保留x列来扩展上述数据。values,以便我获得完整的交叉连接,但使用{{1列。所以预期的决赛桌是

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 ... 中的每一行,我想从其他两个表中获取xid1的所有fid值,并保留id2值。我已经尝试过使用val但是没有做到这一点。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:6)

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

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

产地:

    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), with=F]