5

1)如何正确排序?

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

“ABCDEFGHI Y JKLMNOPRSTUVZ”

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"



“ABCDEFGHIJKLMNOPQRSTUVWX Y Z”对比

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"

所以状态的排序缩写的顺序也不同(注意最后 2,它们应该是"WV" 然后是 "WY"):

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

我试过了Sys.setlocale("LC_TIME","English_United States.1252")。它有助于在绘图、图表和图形中获得工作日的英文名称。

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

2) R 初学者应该注意哪些其他重要的与语言相关的设置?

如果您有建议,R 在哪里表现依赖于语言以及如何处理,请列出它。

4

2 回答 2

6

LC_TIME控制与日期/时间相关的语言排序。为了您的目的,LC_ALL应该做的伎俩:

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

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

于 2015-08-02T13:45:58.720 回答
6

我对 R 不熟悉,但它似乎与许多其他编程语言有同样的问题:标准库中缺乏原生 Unicode 支持。“Unicode 支持”是指 Unicode 标准(http://www.unicode.org/versions/Unicode7.0.0/ch03.pdf)的第 3 章,Unicode 标准的附件(尤其是处理整理http: //unicode.org/reports/tr10/ ) 和最新版本的 CLDR ( http://cldr.unicode.org/)。从本质上讲,如果不选择一些“真实”的方法并忽略文化差异,就无法标准化排序的模棱两可的规则。通过允许忽略某些细节(如变音符号)的多个排序规则级别,创建大小写折叠算法(在某些情况下为 toLower(toUpper(str)) != toLower(str)),通过 CLDR 定义排序规则规则,部分缓解了这种情况数据库,但问题仍然存在。还有诸如上下文相关比较(http://unicode.org/reports/tr10/#Contextual_Sensitivity)之类的问题,如果您想进行“正确”字符串比较,则需要使用符合 Unicode 标准的成熟解决方案.

有一个著名的库称为 ICU(Unicode 的国际组件),与其他库相比,它实现了 Unicode 标准的大量功能。它在 C/C++ 和 Java 中实现(所有开源都具有类似 BSD 的许可证,但与其他语言的 C 版本绑定,包括 R(https://cran.r-project.org/web/packages/ stringi/ , http://site.icu-project.org/related ). 所以你可以使用 'stringi' 项目使用 ICU 语言环境和整理工具进行文本处理。

更新:为了使用 ICU 整理方法,您需要获取 ICU4C(因不同操作系统而异),然后为 R 语言安装一个包:

install.packages('stringi')

然后你应该导入它

library(stringi)

之后您可以使用这些类型的函数(http://docs.rexamine.com/R-man/stringi/stri_compare.html)。您可以将其他参数传递给在这些函数( http://docs.rexamine.com/R-man/stringi/stri_opts_collat​​or.html )末尾创建的整理器,这将影响比较的执行方式.

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')

例如,上面的 'strength' 参数设置所谓的 'collat​​ion level' ( http://unicode.org/reports/tr10/#Notation )。语言环境由此处指定的语言和国家/地区代码指定 ( http://userguide.icu-project.org/locale )。您可以使用这些函数来实现自定义排序函数(例如使用这些函数进行比较的快速排序),因为内置函数似乎没有提供任何更改排序谓词的方法。

更新 2:或者,甚至比实现自己的排序更好,只需使用stri_sort允许您指定自定义 ICU 整理器 ( http://docs.rexamine.com/R-man/stringi/stri_order.html ) 的功能,如下所示:

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 现在处于不同的位置。

于 2015-08-03T18:39:54.437 回答