如何在含NA值的连接数据表中检测匹配差异?
区分连接结果中NA的来源
在连接两个数据表时,不匹配的记录要么被丢弃,要么会在对应列显示为NA。但如果连接的表本身就存在NA值,我们就无法区分结果里的NA到底是因为不匹配导致的缺失,还是原数据表本身就有的NA。
示例数据
先创建示例数据表:
d1 = data.frame(x=c(1,2,3,4),y=c(5,4,3,2)) setDT(d1) ; setkey(d1, x) d2 = data.frame(x=c(1,2,4),z=c(1,2,NA)) setDT(d2) ; setkey(d2, x)
执行后的数据表内容:
> d1 x y 1: 1 5 2: 2 4 3: 3 3 4: 4 2 > d2 x z 1: 1 1 2: 2 2 3: 4 NA
连接后的问题
将d2左连接到d1后,第3行和第4行的z列都是NA,但我们无法区分:第3行的NA是因为d2中没有x=3的记录导致不匹配,还是第4行的NA是d2中x=4时z列本身就有的值。
> d2[d1] x z y 1: 1 1 5 2: 2 2 4 3: 3 NA 3 4: 4 NA 2
一种不够优雅的解决方法
可以给d2新增一个标记列来区分是否匹配:
> d2$match=TRUE > d2[d1] x z match y 1: 1 1 TRUE 5 2: 2 2 TRUE 4 3: 3 NA NA 3 4: 4 NA TRUE 2
通过match列可以判断是否匹配,但这种方法需要额外添加列,不够简洁。
更简洁的解决方案:dplyr的keep参数
如果连接时能保留连接双方的连接键值,就可以通过其中一方的NA来判断是否匹配。dplyr::left_join的keep=TRUE参数就能实现这个功能:
> left_join(d1, d2, keep=TRUE) Joining with `by = join_by(x)` x.x y x.y z 1: 1 5 1 1 2: 2 4 2 2 3: 3 3 NA NA 4: 4 2 4 NA
此时通过x.y列就能可靠区分:x.y为NA表示没有匹配到(第3行),x.y有值则表示匹配成功,对应的z列NA是原数据自带的(第4行)。
内容的提问来源于stack exchange,提问作者Spacedman
相关产品推荐
相关产品推荐

