gpt4 book ai didi

r - dplyr::left_join 等价于 base::merge(..., all.x=TRUE) 吗?

转载 作者:行者123 更新时间:2023-12-03 23:55:32 25 4
gpt4 key购买 nike

我有很多旧的 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)。我也在问,因为在处理大型数据集时,很难一眼看出为什么会发生某些事情(尤其是在处理一些不是您编写的代码时),如果您必须进行一些维护工作,那么像那些无害的sostitutions上面介绍的可能会导致输出发生重大变化。

编辑:我使用的是 dplyr 0.7.4 和 R 3.4.1。

最佳答案

tidyverse 函数使用 de NA作为数据的一部分,因为它应该解释一些“已识别”数据无法解释的信息方面。换句话说,您必须使用特定的函数来删除 NA values .在您的示例中,有多种方法可以执行具有相同结果的相同过程。例如,考虑 na.omit()功能:

library(tidyverse) #This include dplyr package

a = data.frame(id = 1:4,
letter = c(letters[1:3], NA)
) %>% as_tibble()

all.equal(
a %>%
na.omit(letter) %>% #This drop NA values in the column "letter"
group_by(letter) %>%
summarise(id = mean(id)),

aggregate(id ~ letter,
data = a,
FUN = mean ))
#>[1] TRUE

另一个例子是使用 filter()功能:
all.equal(
a %>%
filter(!is.na(letter)) %>% #This drop NA values in the column "letter"
group_by(letter) %>%
summarise(id = mean(id)),

aggregate(id ~ letter,
data = a,
FUN = mean ))
#>[1] TRUE

希望能帮到你!

关于r - dplyr::left_join 等价于 base::merge(..., all.x=TRUE) 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48991097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com