Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于R的语言相关排序 1) 如何正确排序?_R_Sorting_Non English - Fatal编程技术网

基于R的语言相关排序 1) 如何正确排序?

基于R的语言相关排序 1) 如何正确排序?,r,sorting,non-english,R,Sorting,Non English,任务是按照英文字母表对美国各州的缩写名称进行排序。但我注意到,R根据某种操作系统语言或区域设置对列表进行排序。例如,在我的语言(立陶宛语)中,甚至拉丁语(非立陶宛语)字母的顺序也与英语字母表中的顺序不同。仅比较两个字母表中非立陶宛字母的顺序: “ABCDEFGHIYJKLMNOPRSTUVZ” 与 “abcdefghijklmnopqrstuvxxYZ” 因此,各州缩写的排序顺序也不同(注意最后2个,它们应该是“WV”然后是“WY”): 我尝试了Sys.setlocale(“LC\u TIME”

任务是按照英文字母表对美国各州的缩写名称进行排序。但我注意到,R根据某种操作系统语言或区域设置对列表进行排序。例如,在我的语言(立陶宛语)中,甚至拉丁语(非立陶宛语)字母的顺序也与英语字母表中的顺序不同。仅比较两个字母表中非立陶宛字母的顺序:

“ABCDEFGHIYJKLMNOPRSTUVZ”



“abcdefghijklmnopqrstuvxxYZ”

因此,各州缩写的排序顺序也不同(注意最后2个,它们应该是“WV”然后是“WY”):

我尝试了
Sys.setlocale(“LC\u TIME”,“English\u United.1252”)
。它有助于在绘图、图表和数字中获得工作日的英文名称

现在我需要帮助以“英语”的方式正确排序

2) 在R中,初学者R用户还应该注意哪些重要的语言相关设置?
如果您有建议,R的行为依赖于语言以及如何处理,请列出它。

LC\u TIME
控制与日期/时间相关的语言排序。出于您的目的,您应该做到以下几点:

Sys.setenv('LC_ALL', 'English_United States.1252')
sort(letters)

但是,请注意,这些设置是特定于操作系统的。例如,上述方法在典型的Unix系统上不起作用。相反,字符串
'en_US.UTF-8'
通常是一个很好的设置-但在Windows下,这本身可能会带来问题,因为R在Windows上的Unicode支持很粗略。

我对R不熟悉,但它似乎与许多其他编程语言有相同的问题:标准库中缺少本机Unicode支持。“Unicode支持”指的是Unicode标准()的第3章、Unicode标准的附件(特别是涉及排序规则的附件)和最新版本的CLDR()。从本质上讲,排序规则模棱两可,如果不选择一些“真实”的方法并忽略文化差异,就无法将其标准化。通过允许忽略某些细节(如变音符号)的多个排序级别,创建大小写折叠算法(在某些情况下为toLower(toUpper(str))!=toLower(str)),通过CLDR数据库定义排序规则,部分缓解了这一问题,但问题仍然存在。还有一些问题,如上下文相关比较(),如果希望进行“正确”的字符串比较,则需要使用符合Unicode标准的成熟解决方案

有一个名为ICU(Unicode国际组件)的著名库,与其他库相比,它实现了Unicode标准的大量功能。它有C/C++和Java的实现(都是开源的,具有类似BSD的许可证,但也有其他语言的C版本绑定,包括R(,)。因此,您可以使用“stringi”项目使用ICU语言环境和排序工具进行文本处理

更新: 为了使用ICU排序方法,您需要获得ICU4C(不同操作系统的情况不同),然后安装R语言的软件包:

install.packages('stringi')

那么你应该导入它

library(stringi)
之后,您可以使用这些类型的函数()。您可以将其他参数传递给在这些函数()末尾创建的collator,这将影响比较的执行方式

stri_cmp_lt("WV", "WY", locale="lt_LT")
stri_cmp_lt("WV", "WY", locale="en_US")
stri_compare("WV", "WV", locale="en_US", strength='1')
例如,上面的“强度”参数设置了所谓的“排序级别”()。区域设置由此处指定的语言和国家代码指定()。您可以使用这些函数实现自定义排序函数(例如使用这些函数进行比较的快速排序)因为内置函数似乎没有提供任何方法来更改排序谓词

更新2:或者,甚至比实现自己的排序更好,只需使用
stri_sort
函数,该函数允许您指定自定义ICU collator(),如下所示:

stri_sort(state.abb, locale="en_US")
stri_sort(state.abb, locale="lt_LT")

[1] "AK" "AL" "AR" "AZ" "CA" "CO" "CT" "DE" "FL" "GA" "HI" "IA" "ID" "IL" "IN"
[16] "KS" "KY" "LA" "MA" "MD" "ME" "MI" "MN" "MO" "MS" "MT" "NC" "ND" "NE" "NH"
[31] "NJ" "NM" "NV" "NY" "OH" "OK" "OR" "PA" "RI" "SC" "SD" "TN" "TX" "UT" "VA"
[46] "VT" "WA" "WI" "WV" "WY"
 [1] "AK" "AL" "AR" "AZ" "CA" "CO" "CT" "DE" "FL" "GA" "HI" "IA" "ID" "IL" "IN"
[16] "KY" "KS" "LA" "MA" "MD" "ME" "MI" "MN" "MO" "MS" "MT" "NC" "ND" "NE" "NH"
[31] "NY" "NJ" "NM" "NV" "OH" "OK" "OR" "PA" "RI" "SC" "SD" "TN" "TX" "UT" "VA"
[46] "VT" "WA" "WI" "WY" "WV"

请注意,WV和WY现在在不同的地区处于不同的位置。

您的操作系统语言/区域设置是非英语的吗?您是否尝试了
LC\u ALL
而不是
LC\u TIME
?正如您可能猜测的那样,
LC\u TIME
只影响与日期/时间相关的本地化。-另一件事,避免使用Windows字符编码(如代码页1252)。仅使用UTF-8。
LC\U所有工作:
[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”
谢谢你,康拉德·鲁道夫。写下你的评论作为回答,我想接受它,这样对其他人会更有帮助。使用
stringi::stri_sort
并通过
stri_opts_collator
传递你想要的任何区域设置,进行语言相关的排序,而不改变你的环境。这更像是一篇观点文章,而不是对问题的回答e问题;唯一直接解决问题的部分是你的最后一句话,这不是一个很好的答案。你能扩展最后一句话,给出一些实际的例子吗(例如,如@hrbrmstr上面的评论)?(我认为评论的其余部分如果附有答案就可以了…)@BenBolker这更像是“如何处理”部分的指针,但我将尝试给出一个与美国各州相关的示例。Unicode标准非常庞大,因此需要进行大量阅读才能真正理解为什么没有对给定字符串序列进行“真”排序的方法。
library(stringi)
stri_cmp_lt("WV", "WY", locale="lt_LT")
stri_cmp_lt("WV", "WY", locale="en_US")
stri_compare("WV", "WV", locale="en_US", strength='1')
stri_sort(state.abb, locale="en_US")
stri_sort(state.abb, locale="lt_LT")

[1] "AK" "AL" "AR" "AZ" "CA" "CO" "CT" "DE" "FL" "GA" "HI" "IA" "ID" "IL" "IN"
[16] "KS" "KY" "LA" "MA" "MD" "ME" "MI" "MN" "MO" "MS" "MT" "NC" "ND" "NE" "NH"
[31] "NJ" "NM" "NV" "NY" "OH" "OK" "OR" "PA" "RI" "SC" "SD" "TN" "TX" "UT" "VA"
[46] "VT" "WA" "WI" "WV" "WY"
 [1] "AK" "AL" "AR" "AZ" "CA" "CO" "CT" "DE" "FL" "GA" "HI" "IA" "ID" "IL" "IN"
[16] "KY" "KS" "LA" "MA" "MD" "ME" "MI" "MN" "MO" "MS" "MT" "NC" "ND" "NE" "NH"
[31] "NY" "NJ" "NM" "NV" "OH" "OK" "OR" "PA" "RI" "SC" "SD" "TN" "TX" "UT" "VA"
[46] "VT" "WA" "WI" "WY" "WV"