gpt4 book ai didi

r - 多列合并导致奇怪的排序

转载 作者:行者123 更新时间:2023-12-02 01:30:10 25 4
gpt4 key购买 nike

当两个数据框按数字列合并时(默认情况下)它们按该列作为数字排序。但是,如果使用两个数字列作为 by那么它会导致不同的排序(实际上,数字列似乎被转换为字符串并按这样的方式排序)。这是预期的,还是错误?

例如,考虑以下两个数据框:

A <- data.frame(a = 1:12, b = 1, x = runif(12))
B <- data.frame(a = 1:12, b = 1, y = runif(12))

然后 merge(A, B, by = 'a')结果是一个带有 a 列的数据框值为 1、2、...、9、10、11、12(即预期的数字顺序)。然而 merge(A, B, by = c('a', 'b'))结果是一个带有 a 列的数据框值为 1, 10, 11, 12, 2, 3, ..., 8, 9 (即与 sort(as.character(1:12)) 相同的顺序)。

最佳答案

我想这与其说是 merge 的错误,不如说是一个功能。 .
merge的源代码检查表明在使用多列进行合并的情况下,“关键”列通过使用 paste() 在内部组合成一个向量。 .

例如,列 ab来自您的数据框 A将由字符串 "1\r1" "2\r1" "3\r1" "4\r1" "5\r1" "6\r1" "7\r1" "8\r1" "9\r1" "10\r1" "11\r1" "12\r1" 表示.
merge使用此字符串对结果数据框进行排序,这就是它以字母顺序结束的方式。

在只合并一列的情况下,不需要使用paste ,因此使用列的原始类型进行排序。

这是merge的相关源代码(在R控制台运行不带括号的merge.data.frame可以获得全文)

    if (l.b == 1L) {
bx <- x[, by.x]
if (is.factor(bx))
bx <- as.character(bx)
by <- y[, by.y]
if (is.factor(by))
by <- as.character(by)
}
else {
if (!is.null(incomparables))
stop("'incomparables' is supported only for merging on a single column")
bx <- x[, by.x, drop = FALSE]
by <- y[, by.y, drop = FALSE]
names(bx) <- names(by) <- paste0("V", seq_len(ncol(bx)))
bz <- do.call("paste", c(rbind(bx, by), sep = "\r"))
bx <- bz[seq_len(nx)]
by <- bz[nx + seq_len(ny)]
}

关于r - 多列合并导致奇怪的排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34747805/

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