当两个数据框按数字列合并时(默认情况下)它们按该列作为数字排序。但是,如果将两个数字列用作 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 的源代码发现,在使用多列进行合并的情况下,'key' 列在内部通过使用 paste() 组合成一个向量。

例如,数据框 a 中的 bA 列将由字符串 "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不带括号即可获得全文)

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

10-13 06:40