Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R展开一个data.table_R_Merge_Data.table - Fatal编程技术网

R展开一个data.table

R展开一个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')

我有以下情况。如下所示的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')
)

我希望能够通过保留
列来扩展上述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,但没有成功。感谢您的帮助。

有点尴尬,但这应该可以:

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