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
也是如此)将为您提供可靠的“已知”列。
执行左外连接时,如何从右侧 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
也是如此)将为您提供可靠的“已知”列。