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