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)
是的它看起来像是一个(令人尴尬的)与关键字NA相关的新bug.在关键不可能的情况下,还有其他关于NA的讨论,但我没有意识到它会以这种方式搞砸.将调查.谢谢 ...
现在修复于1.8.7(提交780),来自NEWS:
类型为double的连接列中的NA可能导致X [Y]和合并(X,Y)返回不正确的结果,#2453.由于C源中的错误x == NA_REAL应该是ISNA(x).对键控连接的双重支持是对data.table的一个相对较新的补充,但同样令人尴尬.固定和测试添加.非常感谢有关彻底和可重复报告的统计数据.