dplyr :: left_join是否等同于base :: merge(...,all.x = TRUE)?

时间:2018-02-26 14:46:27

标签: r dplyr left-join aggregate-functions

我有很多旧的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。

0 个答案:

没有答案