【问题标题】:Return all columns specified in the join conditions (dplyr)返回连接条件中指定的所有列 (dplyr)
【发布时间】:2017-03-17 08:16:48
【问题描述】:

如果我有两个数据框并使用 dplyr 的left_join 加入它们:

test <- data.frame(numbers = c(1, 2, 3), letters = c("a", "b", "c"))
test2 <- data.frame(numbers2 = c(1, 2), letters2 = c("a", NA))

left_join(test, test2, by = c("numbers" = "numbers2"))

我得到一个这样的数据框:

  numbers letters letters2
1       1       a        a
2       2       b     <NA>
3       3       c     <NA>

我没有从连接条件中看到 numbers2 列。这是设计使然吗?我想获取此列,以便查看来自test2 的返回NA 的记录(即不匹配连接条件的记录)。我不能依靠letters2 来做这件事,因为它不是钥匙。

我如何查看此列以及 dplyr 是否应在其连接函数中创建一个参数来执行此操作?

【问题讨论】:

  • numbersnumbers2 与您加入的相同。由于test2 没有numbers2 = 3 的记录,它返回NA 而另一个NA 在那里,因为您的数据中有一个(test2 中的列letters2);代码或设计没有问题
  • @Titolondon 基于上述数据框,仅此而已,我无法回答“test2 中有多少数字也在测试中”的问题。如果你?left_join 它会这样说:返回来自 x 的所有行,以及来自 x 和 y 的所有列。 x 中没有匹配 y 的行将在新列中具有 NA 值。如果 x 和 y 之间有多个匹配项,则返回匹配项的所有组合。
  • 我认为你的结果完全符合?left_join的解释。您获得了 x 和 y 的所有列以及所有行。但是,您的键列中没有重复项,因此没有多重匹配。由于test2 中存在NA,您无法回答您的问题(否则您将只有一个NA),但您比test 多一行,所以它是您正在寻找的答案。
  • 所以我承认它可能在内部工作的方式是(为了更好的词)将numbersnumbers2 合并为一个输出,但它并没有按照它所说的那样做:它正在返回来自 x 的所有非键列和来自 y 的所有非键列和一个键,这是 3 列,而不是 4。要获得我需要的信息,我需要像这样修改test2test2 &lt;- data.frame(numbers2 = c(1, 2), letters2 = c("a", NA), join_check = 1)merge() 中的行为也相同;只是感觉很糟糕。

标签: r dplyr


【解决方案1】:

是的,这是设计使然,numbers2 已包含在结果数据框中的numbers 中。如果原始test2 不包含NA,您确实会在字母2 中看到它。如果您真的想要它,请将其复制到 test2 中,然后在结果中重命名。

【讨论】:

  • 我只是觉得奇怪的是它在the documentation 中是矛盾的——返回来自 x 的所有行,以及来自 x 和 y 的所有列
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-26
  • 2014-11-05
  • 1970-01-01
相关资源
最近更新 更多