join table 中没有匹配项的元素列表

List of elements in join table without match

执行左外连接时,如何从右侧 table 中找到在左侧 table 中找不到匹配项的元素?您是否只是进行右外连接并丢弃具有匹配项的元素,以便与右侧 table 没有匹配项的元素一起留下?

这似乎是一个粗略的解决方案,那么有没有更优雅的方法来找到右边的孤立元素table?

您可能正在以这种方式寻找anti_join()

right_table %>% anti_join(left_table)

这仅过滤 right_table 中的行,这些行与 left_table 中的任何行都不匹配。

一旦left_join完成,您将无法找出不匹配的内容。正如 Petr 在该答案中所建议的那样,您随后可以使用 anti_join 来查找不匹配的内容。

另一种技术(只需要一个合并操作)是对左侧和右侧唯一的元素进行完全连接和过滤,以查看缺少的内容。

使用full_join示例中使用的数据集:

full_join(band_members, band_instruments)
# Joining, by = "name"
# # A tibble: 4 x 3
#   name  band    plays 
#   <chr> <chr>   <chr> 
# 1 Mick  Stones  <NA>  
# 2 John  Beatles guitar
# 3 Paul  Beatles bass  
# 4 Keith <NA>    guitar

在这个例子中,可以用filter(!is.na(band))近似左连接,用filter(!is.na(plays))近似右连接,最后用filter(is.na(plays))得到第二帧未匹配的元素。

在此示例中,它是“清楚的”,因为在合并之前没有 NA 值。如果没有已知永远不会 NA 的列(在一个或两个框架中),那么您可以添加一个低成本的列。例如 mutate(band_members, orig=TRUE)band_instruments 也是如此)将为您提供可靠的“已知”列。