data.table
包提供了许多与 SQL 相同的表处理方法。如果一个表具有键,则该键由一个或多个列组成。但是一个表不能有多个键,因为它不能同时以两种不同的方式进行排序。
在这个例子中,X
和 Y
是具有单个关键列 "id" 的 data.table
;Y
还具有非关键列 "x_id"。
X <- data.table(id = 1:5, a=4:8,key="id")
Y <- data.table(id = c(1,1, 3,5,7), x_id=c(1,4:1), key="id")
以下语法将根据它们的键将表连接起来: X[Y]
我该如何将以下SQL语法转换为data.table代码?
select * from X join Y on X.id = Y.x_id;
我最接近的是:Y[X,list(id, x_id),by = x_id,nomatch=0]
然而,这并没有像SQL语句中的内连接一样执行。
这是一个更清晰的示例,在此示例中,外键为y_id,并且我们想要进行联接以查找X2$y_id = Y2$id的Y2值。
X2 <- data.table(id = 1:5, y_id = c(1,1,2,2,2), key="id")
Y2 <- data.table(id = 1:5, b = letters[1:5], key="id")
我想要生成一个表格:
id y_id b
1 1 "a"
2 1 "a"
3 2 "b"
4 2 "b"
5 2 "b"
类似于以下方法所使用的技巧:
> merge(data.frame(X2), data.frame(Y2), by.x = "y_id", by.y = "id")
y_id id b
1 1 1 a
2 1 2 a
3 2 3 b
4 2 4 b
5 2 5 b
然而,当我这样做时:
X2[Y2, 1:2,by = y_id]
我没有得到期望的结果:
y_id V1
[1,] 1 1
[2,] 1 2
[3,] 2 1
[4,] 2 2
X2
键并将它们设置为"y_id"
;然后执行正常的连接Y2[X2]
(或者根据方向选择X2[Y2]
),然后恢复X2
的先前键。 - digEmAllby
参数的作用...但是这是否适用于多个(>2)表连接,其中目标(左)表具有>1个外键? - David LeBauerX[Y]
-- 我认为相应的SQL语法应该是:SELECT * FROM A NATURAL JOIN B;
- onedaywhendata.table
中使用的键时遇到了困难。现在,如果我理解正确,'key'是根据特定连接所需设置每个表的关键字。 - David LeBauer