vsa*_*dra 7 r outer-join data.table
在填充的data.table和另一个为空的data.table之间进行合并会在结果data.table中引入一个NA行:
a = data.table(c=c(1,2),key='c')
b = data.table(c=3,key='c')
b=b[c!=3]
b
# Empty data.table (0 rows) of 1 col: c
merge(a,b,all=T)
# c
# 1: NA
# 2: 1
# 3: 2
Run Code Online (Sandbox Code Playgroud)
为什么?我希望它只返回data.table行a
,就像merge.data.frame一样:
> merge.data.frame(a,b,all=T,by='c')
# c
#1 1
#2 2
Run Code Online (Sandbox Code Playgroud)
问题中的例子太简单了,无法显示问题,因此存在混淆和讨论.使用两个单列data.table
s是不够的,以显示它是什么merge
!
这是一个更好的例子:
> a = data.table(P=1:2,Q=3:4,key='P')
> b = data.table(P=2:3,R=5:6,key='P')
> a
P Q
1: 1 3
2: 2 4
> b
P R
1: 2 5
2: 3 6
> merge(a,b) # correct
P Q R
1: 2 4 5
> merge(a,b,all=TRUE) # correct.
P Q R
1: 1 3 NA
2: 2 4 5
3: 3 NA 6
> merge(a,b[0],all=TRUE) # incorrect result when y is empty, agreed
P Q R
1: NA NA NA
2: NA NA NA
3: 1 3 NA
4: 2 4 NA
> merge.data.frame(a,b[0],all=TRUE) # correct
P Q R
1 1 3 NA
2 2 4 NA
Run Code Online (Sandbox Code Playgroud)
里卡多深入研究并将其修复为v1.8.9.来自新闻:
当y为空且all.y = TRUE(或all = TRUE)时,merge不再返回虚假的NA行,#2633.感谢Vinicius Almendra的报道.测试补充.