gpt4 book ai didi

r - 与 data.tables 的多个连接/合并

转载 作者:行者123 更新时间:2023-12-04 11:55:14 25 4
gpt4 key购买 nike

我有两个 data.tables,DT 和 L:

> DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9,key="x")
> L=data.table(yv=c(1L:8L,12L),lu=c(letters[8:1],letters[12]),key="yv")

> DT
x y v
1: a 1 1
2: a 3 2
3: a 6 3
4: b 1 4
5: b 3 5
6: b 6 6
7: c 1 7
8: c 3 8
9: c 6 9

> L
yv lu
1: 1 h
2: 2 g
3: 3 f
4: 4 e
5: 5 d
6: 6 c
7: 7 b
8: 8 a
9: 12 l

我想从 L 中为 y 列和 DT 中的 v 列独立查找 lu 的相应值。以下语法提供了正确的结果,但生成起来很麻烦,稍后一目了然:
> L[setkey(L[setkey(DT,y)],v)][,list(x,y=yv.1,v=yv,lu.1=lu.1,lu.2=lu)]
x y v lu.1 lu.2
1: a 1 1 h h
2: a 2 3 g f
3: a 3 6 f c
4: b 4 1 e h
5: b 5 3 d f
6: b 6 6 c c
7: c 7 1 b h
8: c 8 3 a f
9: c 9 6 NA c

( 编辑 :原始帖子在上面有 L[setkey(L[setkey(DT,y)],v)][,list(x,y=yv,v=yv.1,lu.1=lu,lu.2=lu.1)],它错误地混淆了 y 和 v 列并查找了值。)

在 SQL 中,这很简单/直接:
SELECT DT.*, L1.lu AS lu1, L2.lu AS lu2
FROM DT
LEFT JOIN L AS L1 ON DT.y = L1.yv
LEFT JOIN L AS L2 ON DT.v = L2.yv

有没有更优雅的方法来使用 data.table 来执行多个连接?请注意,在此示例中,我将一张表连接到另一张表两次,但我也有兴趣将一张表连接到多个不同的表。

最佳答案

很好的问题。一个技巧是i不必键入。只有 x必须键入。

可能有更好的方法。这个怎么样:

> cbind( L[DT[,list(y)]], L[DT[,list(v)]], DT )
yv lu yv lu x y v
1: 1 h 1 h a 1 1
2: 3 f 2 g a 3 2
3: 6 c 3 f a 6 3
4: 1 h 4 e b 1 4
5: 3 f 5 d b 3 5
6: 6 c 6 c b 6 6
7: 1 h 7 b c 1 7
8: 3 f 8 a c 3 8
9: 6 c 9 NA c 6 9

或者,为了说明,这是相同的:
> cbind( L[J(DT$y)], L[J(DT$v)], DT )
yv lu yv lu x y v
1: 1 h 1 h a 1 1
2: 3 f 2 g a 3 2
3: 6 c 3 f a 6 3
4: 1 h 4 e b 1 4
5: 3 f 5 d b 3 5
6: 6 c 6 c b 6 6
7: 1 h 7 b c 1 7
8: 3 f 8 a c 3 8
9: 6 c 9 NA c 6 9
merge如果实现了以下功能请求,也可以使用:

FR#2033 Add by.x and by.y to merge.data.table

关于r - 与 data.tables 的多个连接/合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14126337/

25 4 0