我有以下情况。 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')
)
我希望能够做的是通过保留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
...
中的每一行,我想从其他两个表中获取x
和id1
的所有fid值,并保留id2
值。我已经尝试过使用val
但是没有做到这一点。任何帮助表示赞赏。
答案 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]