data.table内部/外部连接,在double类型的连接列中使用NA?

sta*_*ant 10 r inner-join outer-join data.table

在这篇维基百科文章SQL join之后,我希望能够清楚地了解如何与data.table建立联接.在这个过程中,我们可能在加入NAs时发现了一个错误.以wiki为例:

R) X = data.table(name=c("Raf","Jon","Ste","Rob","Smi","Joh"),depID=c(31,33,33,34,34,NA),key="depID")
R) Y = data.table(depID=c(31,33,34,35),depName=c("Sal","Eng","Cle","Mar"),key="depID")
R) X
   name depID
1:  Joh    NA
2:  Raf    31
3:  Jon    33
4:  Ste    33
5:  Rob    34
6:  Smi    34
R) Y
   depID depName
1:    31     Sal
2:    33     Eng
3:    34     Cle
4:    35     Mar
Run Code Online (Sandbox Code Playgroud)

LEFT OUTER JOIN

R) merge.data.frame(X,Y,all.x=TRUE)
  depID name depName
1    31  Raf     Sal
2    33  Jon     Eng
3    33  Ste     Eng
4    34  Rob     Cle
5    34  Smi     Cle
6    NA  Joh    <NA>
Run Code Online (Sandbox Code Playgroud)

merge.data.table 不输出相同的结果,并显示我认为是lign 2上的错误.

R) merge(X,Y,all.x=TRUE)
   depID name depName
1:    NA  Joh     Eng
2:    31  Raf      NA
3:    33  Jon     Eng
4:    33  Ste     Eng
5:    34  Rob     Cle
6:    34  Smi     Cle
R) Y[X] #same -> :(
   depID depName name
1:    NA     Eng  Joh
2:    31      NA  Raf
3:    33     Eng  Jon
4:    33     Eng  Ste
5:    34     Cle  Rob
6:    34     Cle  Smi
Run Code Online (Sandbox Code Playgroud)

RIGHT OUTER JOIN 看起来像是一样的

R) merge.data.frame(X,Y,all.y=TRUE)
  depID name depName
1    31  Raf     Sal
2    33  Jon     Eng
3    33  Ste     Eng
4    34  Rob     Cle
5    34  Smi     Cle
6    35 <NA>     Mar

R) merge(X,Y,all.y=TRUE)
   depID name depName
1:    NA  Joh     Eng
2:    31   NA     Sal
3:    33  Jon     Eng
4:    33  Ste     Eng
5:    34  Rob     Cle 
6:    34  Smi     Cle
7:    35   NA     Mar
Run Code Online (Sandbox Code Playgroud)

内(自然)加入

R) merge.data.frame(X,Y)
  depID name depName
1    31  Raf     Sal
2    33  Jon     Eng
3    33  Ste     Eng
4    34  Rob     Cle
5    34  Smi     Cle
R) merge(X,Y)
   depID name depName
1:    NA  Joh     Eng
2:    33  Jon     Eng
3:    33  Ste     Eng
4:    34  Rob     Cle
5:    34  Smi     Cle
Run Code Online (Sandbox Code Playgroud)

Mat*_*wle 8

是的它看起来像是一个(令人尴尬的)与关键字NA相关的新bug.在关键不可能的情况下,还有其他关于NA的讨论,但我没有意识到它会以这种方式搞砸.将调查.谢谢 ...

#2453双键列中的NA混乱连接(整数NA和字符确定)

现在修复于1.8.7(提交780),来自NEWS:

类型为double的连接列中的NA可能导致X [Y]和合并(X,Y)返回不正确的结果,#2453.由于C源中的错误x == NA_REAL应该是ISNA(x).对键控连接的双重支持是对data.table的一个相对较新的补充,但同样令人尴尬.固定和测试添加.非常感谢有关彻底和可重复报告的统计数据.

  • @MatthewDowle只想说:我喜欢你对社区的反应.感谢您所做的所有工作!保持. (5认同)