Ale*_*lex 9 merge r data.table
我试图理解data.table文档中的逻辑并且有点不清楚.我知道我可以尝试这个,看看会发生什么,但我想确保没有病态的情况,因此想知道逻辑是如何实际编码的.当两个data.table对象具有不同数目的键列的,例如a具有2至b有3个,并在运行c <- a[b],将a与b被前两个键列简单地合并或将在自动第三列合并到第三键列中b?一个例子:
require(data.table)
a <- data.table(id=1:10, t=1:20, v=1:40, key=c("id", "t"))
b <- data.table(id=1:10, v2=1:20, key="id")
c <- a[b]
Run Code Online (Sandbox Code Playgroud)
这应该选择a与id键列匹配的行b.例如,对于id==1in b,有2行b和4行a,应该生成8行c.这确实是发生的事情:
> head(c,10)
id t v v2
1: 1 1 1 1
2: 1 1 21 1
3: 1 11 11 1
4: 1 11 31 1
5: 1 1 1 11
6: 1 1 21 11
7: 1 11 11 11
8: 1 11 31 11
9: 2 2 2 2
10: 2 2 22 2
Run Code Online (Sandbox Code Playgroud)
尝试它的另一种方法是:
d <-b[a]
Run Code Online (Sandbox Code Playgroud)
这应该做同样的事情:对于a它中的每一行应该选择匹配的行b:因为a有一个额外的键列t,该列不应该用于匹配,并且应该仅基于第一个键列id进行连接.看来情况就是这样:
> head(d,10)
id v2 t v
1: 1 1 1 1
2: 1 11 1 1
3: 1 1 1 21
4: 1 11 1 21
5: 1 1 11 11
6: 1 11 11 11
7: 1 1 11 31
8: 1 11 11 31
9: 2 2 2 2
10: 2 12 2 2
Run Code Online (Sandbox Code Playgroud)
有人可以证实吗?要清楚:是a在任何合并中data.table使用的第三个键列,或者仅使用min(length(key(DT)))两个表中的列.
好问题.首先,正确的术语是(来自?data.table):
[data.table]可以包含一列或多列的一个键.此键可用于行索引而不是rownames.
所以"关键"(单数)不是"键"(复数).目前,我们可以使用"钥匙".但是,当二级密钥在将来添加,有可能再是多个密钥.每个键(单数)可以有多个列(复数).
否则你是绝对正确的.基于其他人的反馈,以下段落在v1.8.2中得到了改进.来自?data.table:
当我是data.table时,x必须有一个键.我使用x的键加入x,并返回匹配的x行.在i的每列之间对x的键中的每列执行等连接; 即,i的第1列与x的第1列匹配,第2列与第2列匹配,等等.匹配是在编译的C中在O(log n)时间内的二进制搜索.如果我的列少于x的键,则x的多行通常与i的每一行匹配,因为不是所有x的键列都将连接到(一个常见的用例).如果我有比x的键更多的列,则不参与连接的i列将包含在结果中.如果我也有一个密钥,那么i是用于匹配x的密钥列的密钥列(i的密钥的第1列连接到x的密钥的第1列,第2列连接到第2列,依此类推)和二进制合并这两个表的执行情况.在所有连接中,列的名称无关紧要.x键的列按顺序连接,从i的第1列开始,当我未键入时,或者从i的键的第1列开始.
以下评论,在v1.8.3(关于R-Forge)中,现在读取(以粗体显示):
当我是data.table时,x必须有一个键.我使用x的键加入x,并返回匹配的x行.在i的每列之间对x的键中的每列执行等连接; 即,i的第1列与x的第1列匹配,第2列与第2列匹配,等等.匹配是在编译的C中在O(log n)时间内的二进制搜索.如果我的列少于x的键,则不是所有x的键列都将连接到(一个常见的用例),并且x的许多行将(通常)匹配到i的每一行.如果我有比x的键更多的列,则不参与连接的i列将包含在结果中.如果我也有一个键,那么i是用于匹配x的键列的键列(i的键的第1列连接到x的键的第1 列,第i列的第2列连接到x的键的第2列,所以只要较短的密钥)和两个表的二进制合并就执行.在所有连接中,列的名称无关紧要; x键的列按顺序连接,从i的第1列开始,当我未键入时,或者从i的键的第1列开始.在代码中,连接列的数量由min(长度(key(x)),if(haskey(i))length(key(i))else ncol(i)确定.