覆盖 data.table 键顺序导致不正确的合并结果

Overriding data.table key order causes incorrect merge results

在下面的示例中,我在 data.table 上使用 dplyr::arrange 和一个键。这将覆盖该列的排序:

x <- data.table(a = sample(1000:1100), b = sample(c("A", NA, "B", "C", "D"), replace = TRUE), c = letters)
setkey(x, "a")

# lose order on datatable key
x <- dplyr::arrange(x, b)

y <- data.table(a = sample(1000:1100), f = c(letters, NA), g = c("AA", "BB", NA, NA, NA, NA))
setkey(y, "a")

res <- merge(x, y, by = c("a"), all.x = TRUE)
# try merge with key removed
res2 <- merge(x %>% as.data.frame() %>% as.data.table(), y, by = c("a"), all.x = TRUE)

# merge results are inconsistent
identical(res, res2)

我可以看到,如果我用 x <- x[order(b)] 排序,我会保持键的排序并且结果是一致的。

我不确定为什么我不能使用 dplyr::arrange 以及排序键与合并有什么关系。任何见解将不胜感激。

问题在于,使用 dplyr::arrange(x, b) 时,您不会从 data.table 中删除 sorted 属性,这与使用 x <- x[order(b)]setorder(x, "b") 不同。

data.table 方法是首先使用 setorder,例如

library(data.table)
x <- data.table(a = sample(1000:1100), b = sample(c("A", NA, "B", "C", "D"), replace = TRUE), c = letters)
setorder(x, "b", "a", na.last=TRUE)

data.table 上具有 key 的连接的错误结果是一个已知错误(另请参阅 [=13= 中的 #5361 ] 错误跟踪器)。