order() 函数也存在同样的问题。
> Sys.setlocale('LC_COLLATE', "C.UTF-8")
[1] "C.UTF-8"
> x <- data.frame(a = c("a.00","a_00", "a.01"), b = 1:3)
> x[order(x$a), ]
a b
2 a_00 2
1 a.00 1
3 a.01 3
> Sys.setlocale('LC_COLLATE', "C")
[1] "C"
> x <- data.frame(a = c("a.00","a_00", "a.01"), b = 1:3)
> x[order(x$a), ]
a b
1 a.00 1
3 a.01 3
2 a_00 2
为保证字符串排序的结果稳定性,参考yihui的思路,指定区域设置:
order <- function(...) {
clt = Sys.getlocale('LC_COLLATE')
on.exit(Sys.setlocale('LC_COLLATE', clt), add = TRUE)
Sys.setlocale('LC_COLLATE', 'C')
base::order(...)
}
> Sys.setlocale('LC_COLLATE', "C.UTF-8")
[1] "C.UTF-8"
> x <- data.frame(a = c("a.00","a_00", "a.01"), b = 1:3)
> x[order(x$a), ]
a b
1 a.00 1
3 a.01 3
2 a_00 2
> Sys.setlocale('LC_COLLATE', "C")
[1] "C"
> x <- data.frame(a = c("a.00","a_00", "a.01"), b = 1:3)
> x[order(x$a), ]
a b
1 a.00 1
3 a.01 3
2 a_00 2