bro*_*oli 2 merge r 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))
Run Code Online (Sandbox Code Playgroud)
我有给值之间的映射在其他两个数据表id1和id2看起来像下面
id1.dt = data.table(
id1 = c('a','a','a','b','b','c'),
fid = c('1232','3224','3434','234','231','332')
)
Run Code Online (Sandbox Code Playgroud)
和
id2.dt = data.table(
id2 = c('x','x','y','y'),
fid = c('334','443','344','24')
)
Run Code Online (Sandbox Code Playgroud)
我希望能够做的是x通过保留values列来扩展上面的data.table ,以便我获得完整的交叉连接,但是使用该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
...
Run Code Online (Sandbox Code Playgroud)
基本上,每行中x我要带的所有FID值id1,并id2从其他两个表和保存val价值.我尝试过使用,CJ但没有达到目的.任何帮助赞赏.
有点尴尬,但这应该这样做:
setkey(x, id1)
(setkey(x[id1.dt], id2))[
id2.dt, allow.cartesian=T][
order(val), -(1:2), with=FALSE
]
Run Code Online (Sandbox Code Playgroud)
生产:
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
Run Code Online (Sandbox Code Playgroud)
您还可以尝试merge.data.table以更直观易懂的形式获得类似的结果:
merge(
merge(x, id1.dt, by="id1"),
id2.dt, by="id2", allow.cartesian=T
)[, -(1:2), with=F]
Run Code Online (Sandbox Code Playgroud)