【发布时间】: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 是否应在其连接函数中创建一个参数来执行此操作?
【问题讨论】:
-
numbers和numbers2与您加入的相同。由于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多一行,所以它是您正在寻找的答案。 -
所以我承认它可能在内部工作的方式是(为了更好的词)将
numbers和numbers2合并为一个输出,但它并没有按照它所说的那样做:它正在返回来自 x 的所有非键列和来自 y 的所有非键列和一个键,这是 3 列,而不是 4。要获得我需要的信息,我需要像这样修改test2;test2 <- data.frame(numbers2 = c(1, 2), letters2 = c("a", NA), join_check = 1)。merge()中的行为也相同;只是感觉很糟糕。