【问题标题】:R - dplyr - returning true/false (or similar) from left_join callR - dplyr - 从 left_join 调用返回真/假(或类似)
【发布时间】:2019-11-22 23:24:13
【问题描述】:

如果我有两个数据框 x 和 y...

x 有列 col1, col2, col3, col4, ... y 有 col1 和 col2 列

我想知道 x 中的哪些记录在 y 中找到匹配项(即我在两个表中查找具有相同名称的两个字段,并找到匹配项)。我试图通过 left_join 做到这一点,但使用了非常丑陋的:

y$flag = 12345 # or 1 or TRUE or anything at all really
x <- x %>% left_join(y, by = c("col1" = "col1", "col2" = "col2")

我确信有一种更优雅的方法可以做到这一点,但我在这里不够了解。谁能推荐一个更好的方法?

谢谢。

【问题讨论】:

  • 为了更好地帮助您,您能否包含一个使用dput 的可重现示例以及预期输出?

标签: r dplyr


【解决方案1】:

如果您只想根据y-data 基本上过滤您的x-data,您可以使用semi_join()(在 y 中匹配时保留 x)或 anti_join()(在匹配时删除 x y)。这些也称为过滤器连接方法。

x <- x %>% anti_join(y, by = c("col1" = "col1", "col2" = "col2")

从帮助页面:

anti_join(): 从 x 中返回所有在 y 中没有匹配值的行,只保留来自 x 的列。

但是,出于调试目的,我经常使用您的y$flag &lt;- TRUE-left-join-method。


根据 OP 的评论编辑

【讨论】:

  • 谢谢。我应该更充分地解释一下:我确实想保留 x 中没有找到匹配项的行(因此专门使用 left_join()),在这种情况下,我认为 (?) semi_join 不会在这里工作。我的错。
  • 那么你就可以使用anti_join了。 Uodated 我的答案
  • 那我不会丢失在找到匹配的x的记录吗?我想保留 x 的每一行(无论是否找到匹配项)。道歉 - 我可以再明确一点。
  • 我不明白你的意思。当您已经有了解决方案时,您对解决方案有何期望?请注意,“良好的编码实践”或“最佳风格”问题与 SO 无关。
  • 好的。我没有意识到这一点。正式注明。
【解决方案2】:

您可以使用另一种方法为by 条件和intersect 创建命名向量。

x <- x %>%
  left_join(y, by = setNames(intersect(colnames(x), colnames(y)),
                             intersect(colnames(x), colnames(y))))

不确定它是否不那么难看。这就是dplyr 在默认情况下基本上会做的事情(但有一条消息)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 2021-11-05
    • 1970-01-01
    • 2019-10-15
    相关资源
    最近更新 更多