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