R 键列数不同时合并data.table

R 键列数不同时合并data.table,r,merge,data.table,R,Merge,Data.table,我试图从文档中理解data.table中的逻辑,但有点不清楚。我知道我可以尝试一下,看看会发生什么,但我想确保没有病理病例,因此我想知道逻辑实际上是如何编码的。当两个data.table对象的键列数不同时,例如a有2个键列,b有3个键列,然后运行cQuote data.table: X[Y]是一个连接,使用Y(或Y的键,如果有)作为索引查找X的行。 Y[X]是一个连接,使用X(或X的键,如果有)作为索引查找Y的行。 merge(X,Y)同时执行两种方式。X[Y]和Y[X]的行数通常不同; 而me

我试图从文档中理解
data.table
中的逻辑,但有点不清楚。我知道我可以尝试一下,看看会发生什么,但我想确保没有病理病例,因此我想知道逻辑实际上是如何编码的。当两个
data.table
对象的键列数不同时,例如
a
有2个键列,
b
有3个键列,然后运行
cQuote data.table:

X[Y]是一个连接,使用Y(或Y的键,如果有)作为索引查找X的行。 Y[X]是一个连接,使用X(或X的键,如果有)作为索引查找Y的行。 merge(X,Y)同时执行两种方式。X[Y]和Y[X]的行数通常不同; 而merge(X,Y)和merge(Y,X)返回的行数是相同的


好问题。首先,正确的术语是(来自
?data.table
):

[data.table]可以有一个或多个列的键。此键可用于行索引而不是行名

所以“键”(singlular)不是“键”(复数)。目前,我们可以用“钥匙”逃脱。但当将来添加辅助密钥时,可能会有多个密钥。每个键(单数)可以有多个列(复数)

否则你绝对正确。根据其他人的反馈,v1.8.2对以下段落进行了改进。从
?数据表

当i是data.table时,x必须有一个键。使用x的键将i连接到x,并返回x中匹配的行。在i中的每列与x键中的每列之间执行等联接;i、 例如,i的第1列与x键的第1列相匹配,第2列与第二列相匹配,等等。匹配是在O(logn)时间内以编译的C进行的二进制搜索。如果i的列数少于x的键,那么x的许多行通常会与i的每一行相匹配,因为并非所有x的键列都会连接到i(一个常见的用例)。如果i的列数大于x的键数,则结果中将包括未参与联接的i的列。如果我也有一个键,则使用i的键列来匹配x的键列(i的键的列1连接到x的键的列1,列2连接到列2,依此类推),并执行两个表的二进制合并。在所有联接中,列的名称都是无关的。x键的列按顺序连接,当i未连接时,从i的第1列开始,或从i键的第1列开始


以下注释,在v1.8.3(关于R-Forge)中,现在改为(粗体更改):

当i是data.table时,x必须有一个键。使用x的键将i连接到x,并返回x中匹配的行。在i中的每列与x键中的每列之间执行等联接;i、 例如,i的第1列与x键的第1列相匹配,第2列与第二列相匹配,等等。匹配是在O(logn)时间内以编译的C进行的二进制搜索。如果i的列少于x的键,那么不是所有x的键列都将被连接到(一个常见的用例),并且x的许多行(通常)将与i的每一行匹配。如果i的列数大于x的键数,则结果中将包括未参与联接的i的列。如果我也有一个键,则使用i的键列来匹配x的键列(i的键的列1连接到x的键的列1,i的键的列2连接到x的键的列2,依此类推,只要较短的键),并执行两个表的二进制合并。在所有连接中,列的名称都是无关的;x键的列按顺序连接,当i未连接时,从i的第1列开始,或从i键的第1列开始在代码中,连接列的数量由min(长度(键(x))确定,if(haskey(i))长度(键(i))else ncol(i))确定。


如果你展示了你的尝试和想法,然后要求确认你所推断的事实上是如何工作的,我会对这个问题感到非常兴奋。@GSee:好的,你认为这是我试图理解的东西吗?那么你的问题是:这个输出与你描述的相符吗?我会同意的。合并正在发生,正如你所描述的那样。由于
a
b
中的列不同,以及回收工作的方式不同,所以行和列的排序顺序都不同。i、 e.
rep(1:10,10)
rep(1:10,每个=10)
之间的区别当我读到它时,它说,“如果有多个键,只使用第一个键?”@GSee,是的,这正是问题所在:第三个键是与第三列匹配的,还是在另一个表只有两个键的情况下不使用?这对我来说是令人困惑的部分:“如果我也有一个键,则用于匹配x键列的是我的键列(i键的第1列与x键的第1列相连,第2列与第2列相连,依此类推)。”。。。“这听起来像是我们将使用
i
中的所有键,并与
x
中的列相匹配,即使
x
中作为键一部分的列已用完。谢谢你的澄清!但如果我们用完了x中的键列,那么除了停在那里,我们还能做什么呢?为什么听起来我们会使用所有i的键列?听起来像是滚动i的键列,然后匹配到第1个和第2个。。x的第n列,即使只有第一个KI可以看到添加类似“当x和i都设置了键时,将有
min(length(key(i)),length(key(x)))
join列;即,join中涉及的列”。这会有帮助吗?更改已提交并添加了新闻项。如果问题不清楚,请道歉,但这与我试图解决的问题无关。
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]
> 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
d <-b[a]
> 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