UUID 列上 dplyr::join 的结果在 Linux 和 Mac OS 之间有所不同

问题描述 投票:0回答:1

我正在尝试根据每个 Tibbles 中的 UUID 列连接 2 个 Tibbles (

dplyr::inner_join
)。奇怪的是,连接产生的不是预期的一对一关系,而是多对多关系(如警告消息中所述,并且生成的 tibble 包含比原始 tibbles 多得多的记录也表明了这一点)。在深入研究连接结果时,很明显,tibble 是在不匹配的 UUID 上连接的,这会产生不正确的多对多关系。将 UUID 列的数据类型从
UUID
更改为
character
会产生正确的一对一关系(如生成的 tibble 所示,其中包含与两个原始 tibbles 相同数量的记录)。

我与一位同事共享了我的代码,当他运行该代码时(即通过 UUID 列进行内部联接,每列的数据类型 =

UUID
),它产生了预期的一对一关系。我们各自的计算环境之间唯一明显的区别是操作系统:我的是 Ubuntu 22.04.4,他的是 Mac OS Ventura。我们都使用 RStudio 2023.12.1+402。

如果您能深入了解导致这种与操作系统相关的差异的原因,以及如何在使用 Linux 操作系统时避免 UUID 列的错误连接,我将不胜感激。

这是演示该问题的最小可重现示例:

# load packages

library(dplyr)
library(uuid)

# create 2 datasets

id1 <- UUIDgenerate(n = 100000, output = "uuid")
data1a <- tibble(id1, type_m = "aaaa")

data1b <- data1a %>% 
  rename(type_n = type_m) %>% 
  mutate(type_n = replace(type_n, type_n == "aaaa", "bbbb"))

# join on id1 column with "UUID" data type 

data1c <- data1a %>% 
  inner_join(data1b, by = join_by(id1), keep = TRUE)

# identify mis-joined records

data1c_troubleshoot <- data1c %>% filter(id1.x != id1.y)

# change data type of join_by column to "character" and join

data1a <- data1a %>% mutate(id1 = as.character(id1))
data1b <- data1b %>% mutate(id1 = as.character(id1))

data1c <- data1a %>% 
  inner_join(data1b, by = join_by(id1), keep = TRUE)

data1c_troubleshoot <- data1c %>% filter(id1.x != id1.y)
linux macos join dplyr uuid
1个回答
0
投票

我在 R 版本 4.0.2 (2020-06-22) 的 AWS Linux/Ubuntu (18.04.1-Ubuntu) 服务器上运行了上述代码,没有出现任何问题/UUID 数据类型连接不正确。所有数据点都正确连接。

© www.soinside.com 2019 - 2024. All rights reserved.