Dav*_*uer 19 sql r data.table
该data.table包提供了许多与SQL相同的表处理方法.如果表具有键,则该键由一列或多列组成.但是一个表不能有多个键,因为它不能同时以两种不同的方式排序.
在这个例子中,X和Y是data.tables的一个单一的键列"ID"; 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")
Run Code Online (Sandbox Code Playgroud)
以下语法将在其键上连接表:
X[Y]
Run Code Online (Sandbox Code Playgroud)
如何将以下SQL语法转换为data.table代码?
select * from X join Y on X.id = Y.x_id;
Run Code Online (Sandbox Code Playgroud)
我得到的最接近的是:
Y[X,list(id, x_id),by = x_id,nomatch=0]
Run Code Online (Sandbox Code Playgroud)
但是,这不会与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")
Run Code Online (Sandbox Code Playgroud)
我想制作表格:
id y_id b
1 1 "a"
2 1 "a"
3 2 "b"
4 2 "b"
5 2 "b"
Run Code Online (Sandbox Code Playgroud)
类似于以下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
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时:
X2[Y2, 1:2,by = y_id]
Run Code Online (Sandbox Code Playgroud)
我没有得到预期的结果:
y_id V1
[1,] 1 1
[2,] 1 2
[3,] 2 1
[4,] 2 2
Run Code Online (Sandbox Code Playgroud)
Mat*_*wle 17
好问题.请注意以下内容(诚然埋没)?data.table:
什么时候
i是data.table,x一定要有钥匙.i加入x使用键并x返回该匹配中的行.在每个列之间执行等于连接i到每个列x的键中.匹配是在O(log n)时间内编译的C中的二进制搜索.如果i列的列数少于x键的数量,那么很多行x可能与每行的列匹配i.如果i列的列数多于x键的数,i则不包含在连接中的列将包含在结果中.如果i还有一个键,则它是i用于匹配x键列的键列,并执行两个表的二进制合并.
所以,这里的关键是i不必键入.只有x必须键入.
X2 <- data.table(id = 11:15, y_id = c(14,14,11,12,12), key="id")
id y_id
[1,] 11 14
[2,] 12 14
[3,] 13 11
[4,] 14 12
[5,] 15 12
Y2 <- data.table(id = 11:15, b = letters[1:5], key="id")
id b
[1,] 11 a
[2,] 12 b
[3,] 13 c
[4,] 14 d
[5,] 15 e
Y2[J(X2$y_id)] # binary search for each item of (unsorted and unkeyed) i
id b
[1,] 14 d
[2,] 14 d
[3,] 11 a
[4,] 12 b
[5,] 12 b
Run Code Online (Sandbox Code Playgroud)
要么,
Y2[SJ(X2$y_id)] # binary merge of keyed i, see ?SJ
id b
[1,] 11 a
[2,] 12 b
[3,] 12 b
[4,] 14 d
[5,] 14 d
identical(Y2[J(X2$y_id)], Y2[X2$y_id])
[1] FALSE
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5827 次 |
| 最近记录: |