按字母顺序排序时,字母 "y" 在字母 "i" 后面。

45
使用函数 sort(x) 时,其中 x 是一个字符,字母“y”会跳到中间,紧接在字母“i”之后。
> letters
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t"
[21] "u" "v" "w" "x" "y" "z"

> sort(letters)
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "y" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
[21] "t" "u" "v" "w" "x" "z"

可能的原因是我所在的立陶宛使用了“立陶宛式”的字母排序方式,但我需要正常的排序方式。如何在R代码中将排序方法更改回正常?

我正在使用Win7上的R 2.15.2。


7
R会从Windows获取您的本地设置。要么更改Windows设置,要么在R中使用Sys.setlocale函数来进行设置。 - James
5
尝试这个:Sys.setlocale(category="LC_COLLATE", "C"); sort(letters) - Josh O'Brien
3
这个问题在“?Comparison”帮助页面上有描述。 - Richie Cotton
33
对于“正常排序”吹毛求疵:将英语视为“正常”的想法正是导致大量全球化错误的原因之一... - Heinzi
3
如果OP或其他受影响的人想要了解清楚,?sort文档中已经非常明确地记录了这种行为。不阅读文档的惩罚要比使某些内容与语言环境相关的惩罚更严重。 - Gavin Simpson
显示剩余6条评论
2个回答

39

您需要更改R运行的区域设置。可以在整个Windows安装中进行更改(这似乎不是最佳选择),也可以通过以下方式在R会话中进行更改:

Sys.setlocale("LC_COLLATE", "C")

你可以在那里使用任何其他有效的区域设置字符串替换"C",但这应该能让你回到你想要的letters排序方式。
阅读?locales以获取更多信息。
我想值得注意的是姐妹函数Sys.getlocale(),它查询区域设置参数的当前设置。因此,你可以执行
(locCol <- Sys.getlocale("LC_COLLATE"))
Sys.setlocale("LC_COLLATE", "lt_LT")
sort(letters)
Sys.setlocale("LC_COLLATE", locCol)
sort(letters)
Sys.getlocale("LC_COLLATE")

## giving:
> (locCol <- Sys.getlocale("LC_COLLATE"))
[1] "en_GB.UTF-8"
> Sys.setlocale("LC_COLLATE", "lt_LT")
[1] "lt_LT"
> sort(letters)
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "y" "j" "k" "l" "m" "n"
[16] "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "z"
> Sys.setlocale("LC_COLLATE", locCol)
[1] "en_GB.UTF-8"
> sort(letters)
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o"
[16] "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"
> Sys.getlocale("LC_COLLATE")
[1] "en_GB.UTF-8"

当然,这正是 @Hadley 的答案所展示的,一旦您安装了 devtoolswith_collate() 可以更加简洁地完成这个任务。


3
你知道在哪里可以找到可用区域设置列表(例如,用于立陶宛的“lt_LT”等)吗? - Josh O'Brien
2
@JoshO'Brien http://www.localeplanet.com/icu/ 列出了 ICU 名称,这些名称似乎在 Mac 上大多数情况下都可以使用(仅限“xx_YY”形式,而不是“xx”形式)(我认为 Linux 也是如此)。不幸的是,它是系统特定的,而 Windows 则完全不同。 - hadley
2
@JoshO'Brien Windows本地化信息请参考http://msdn.microsoft.com/en-us/goglobal/bb895996.aspx(由JJ Allaire提供) - hadley
@hadley -- 太棒了。谢谢! - Josh O'Brien

34

如果您只想临时执行此操作,devtools 提供了 with_collate 函数:

library(devtools)
with_collate("C", sort(letters))
# [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
# [20] "t" "u" "v" "w" "x" "y" "z"
with_collate("lt_LT", sort(letters))
# [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "y" "j" "k" "l" "m" "n" "o" "p" "q" "r"
# [20] "s" "t" "u" "v" "w" "x" "z"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接