【发布时间】:2012-04-12 11:19:11
【问题描述】:
data.table 包提供了许多与 SQL 相同的表处理方法。如果一个表有一个键,则该键由一个或多个列组成。但是一个表不能有多个键,因为它不能同时以两种不同的方式排序。
在此示例中,X 和 Y 是具有单个键列“id”的 data.tables; 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,我们希望连接查找 Y2 的值,其中 X2$y_id = Y2$id。
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"
类似于以下 kludge 所做的事情:
> 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的前一个键。 -
@digEmAll 这很有用,我认为这就是
by参数的作用......但这可以应用于目标(左)表具有的多个(>2)表连接>1 个外键? -
我同意@digEmAll:
setkey(X2, y_id)后跟X2[Y2, nomatch=0]是您的示例所需要的全部内容。这也应该与几个键一起使用。但是,我对 SQL 中的外键语法并不是很熟悉,所以如果您正在为更多键而苦苦挣扎,您可以扩展您的示例吗? -
"以下语法将在其键上连接表:
X[Y]-- 我认为等效的 SQL 语法是:SELECT * FROM A NATURAL JOIN B; -
我编辑了问题的顶部以清除术语。希望没事。会回答...
标签: sql r data.table