我有很多旧的R代码使用以下语法来执行我认为是左连接(或者如果您更喜欢SQL名称,则保留左外连接):
merge(a, b, by="id", all.x=TRUE)
从我的观点来看,这完全等同于使用dplyr的专用功能:
left_join(a, b, by="id")
我想知道是否总是如此,或者两者在某些情况下会导致不同的结果。请随时提供何时可以被视为等效的示例,以及何时不等。
在这个愚蠢的例子中,两者似乎产生了相同的结果
require(dplyr)
a = data.frame(id=1:4, c(letters[1:3], NA)) %>% as_tibble()
b = data.frame(id=1:2) %>% as_tibble()
all_equal(left_join(b, a, by="id"), merge(b, a, by='id', all.x = T))
# TRUE
我问这个是因为,例如,stats :: aggregate和dplyr :: group_by,如果与默认参数一起使用,则不等效:
a %>% group_by(letter) %>% summarise(mean(id))
# # A tibble: 4 x 2
# letter `mean(id)`
# <fct> <dbl>
# 1 a 1.00
# 2 b 2.00
# 3 c 3.00
# 4 <NA> 4.00
aggregate(id ~ letter, data = a, FUN = mean)
# letter id
# 1 a 1
# 2 b 2
# 3 c 3
如果你从dplyr的数据中省略了NA,它们会给出相同的结果(因为聚合的默认值是na.omit)。我还要问,因为在处理大型数据集时,很难发现为什么会发生某些事情(特别是在处理一些不是由您编写的代码时),以及是否需要进行一些维护工作,像上面提到的无害的制度可以导致产出的重大变化。
编辑:我使用的是dplyr 0.7.4和R 3.4.1。