r data.table(<;=1.9.4)连接行为

r data.table(<;=1.9.4)连接行为,r,join,data.table,R,Join,Data.table,一段时间后,我又回到了使用r和data.table,但我仍然对连接有问题。我以前问过,结果得到了令人满意的解释,但我仍然没有真正理解其中的逻辑。 让我们考虑几个例子: library("data.table") X <- data.table(chiave=c("a", "a", "a", "b", "b"),valore1=1:5) Y <- data.table(chiave=c("a", "b", "c", "d"),valore2=1:4) X chiave valor

一段时间后,我又回到了使用r和data.table,但我仍然对连接有问题。我以前问过,结果得到了令人满意的解释,但我仍然没有真正理解其中的逻辑。 让我们考虑几个例子:

library("data.table")
X <- data.table(chiave=c("a", "a", "a", "b", "b"),valore1=1:5)
Y <- data.table(chiave=c("a", "b", "c", "d"),valore2=1:4)
X
   chiave valore1
1:      a       1
2:      a       2
3:      a       3
4:      b       4
5:      b       5
 Y
   chiave valore2
1:      a       1
2:      b       2
3:      c       3
4:      d       4
因此:

请注意,
X
有重复的键,
i
没有。如果我将
Y
更改为:

 Y <- data.table(chiave=c("b", "c", "d"),valore2=1:3)
 Y
   chiave valore2
1:      b       1
2:      c       2
3:      d       3
另一方面:

 X <- data.table(chiave=c("a", "a", "a", "a", "a", "a", "b", "b"),valore1=1:8)
 Y <- data.table(chiave=c("b", "b", "d"),valore2=1:3)
 X
   chiave valore1
1:      a       1
2:      a       2
3:      a       3
4:      a       4
5:      a       5
6:      a       6
7:      b       7
8:      b       8
 Y
   chiave valore2
1:      b       1
2:      b       2
3:      d       3

从我的观点来看,当且仅当我在X和I中都有多个键时(不仅当结果表的行数超过
max(nrow(X),nrow(I)
)时),我需要得到警告,并且只有在这种情况下,我才看到需要
allow.cartesian
(所以在我的前两个示例中不是这样)。

为了回答这个问题,在当前的开发版本
v1.9.5
中,已修复了带有
allow.cartesian
的这种行为,并将很快作为
v1.9.6
在CRAN上提供。奇数版本是devel,甚至是稳定的。发件人:

  • allow.cartesian
    在连接过程中被忽略,当:

    • i
      没有重复项,并且
      mult=“all”
      。关闭。感谢@nigmastar的报道
    • 通过引用赋值,即
      j
      具有
      :=
      。关闭。感谢@matthieugomez的报道
    在这两种情况下(以及在中已修复的
    不连接期间),
    允许.cartesian
    可以安全地忽略


  • 您使用的是哪个版本的
    data.table
    ?它似乎适用于1.9.5。我正在使用1.9.4。不是它不起作用,而是我觉得它的行为方式很奇怪。我的示例是否在v中得到不同的错误消息。1.9.5?设置键(X,交叉键)无错误信息;X[Y]
    。绝对正确。已在
    v1.9.5
    中修复。检查。注:请从您的帖子中删除
    ,以便于复制/粘贴。@Arun在哪里可以找到中的v.1.9.5我可以看到v.1.9.4
     Y <- data.table(chiave=c("b", "c", "d"),valore2=1:3)
     Y
       chiave valore2
    1:      b       1
    2:      c       2
    3:      d       3
    
     X[Y]
       chiave valore1 valore2
    1:      b       4       1
    2:      b       5       1
    3:      c      NA       2
    4:      d      NA       3
    
     X <- data.table(chiave=c("a", "a", "a", "a", "a", "a", "b", "b"),valore1=1:8)
     Y <- data.table(chiave=c("b", "b", "d"),valore2=1:3)
     X
       chiave valore1
    1:      a       1
    2:      a       2
    3:      a       3
    4:      a       4
    5:      a       5
    6:      a       6
    7:      b       7
    8:      b       8
     Y
       chiave valore2
    1:      b       1
    2:      b       2
    3:      d       3
    
     setkey(X,chiave)
     X[Y]
       chiave valore1 valore2
    1:      b       7       1
    2:      b       8       1
    3:      b       7       2
    4:      b       8       2
    5:      d      NA       3