【问题标题】:List of elements in join table without match [duplicate]连接表中没有匹配的元素列表[重复]
【发布时间】:2020-10-11 00:47:55
【问题描述】:

在执行左外连接时,如何从右表中找到未在左表中找到匹配项的元素?你是否只是做一个右外连接并丢弃匹配的元素,留下右表中没有匹配的元素?

这似乎是一个粗略的解决方案,那么有没有更优雅的方法可以在右表中找到孤立元素?

【问题讨论】:

  • 左连接后,无法立即找到不匹配的元素。您可以使用 anti_join 在单独的合并操作中查找未找到的内容。
  • 或者您可以执行full_join 并在左侧数据的字段中查找缺少数据的元素。

标签: r outer-join


【解决方案1】:

一旦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 也是如此)将为您提供可靠的“已知”列。

【讨论】:

    【解决方案2】:

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

    right_table %>% anti_join(left_table)
    

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

    【讨论】:

      猜你喜欢
      • 2013-05-07
      • 2020-10-27
      • 2014-12-31
      • 1970-01-01
      • 1970-01-01
      • 2020-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多