R展开一个data.table
我有以下情况。如下所示的data.tableR展开一个data.table,r,merge,data.table,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)) 我还有另外两个数据表,它们给出了id1和id2中的值之间的映射,如下所示 id1.dt = data.table( id1 = c('a','a','a','b','b','c'), fid = c('1232','3224','3434','234','231','332')
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')
)
及
我希望能够通过保留值
列来扩展上述data.tablex
,这样我就可以得到一个完整的交叉连接,但要使用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,但没有成功。感谢您的帮助。有点尴尬,但这应该可以:
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(x, id1.dt, by="id1"),
id2.dt, by="id2", allow.cartesian=T
)[, -(1:2)]