R语言依赖排序

时间:2015-08-02 13:07:30

标签: r sorting non-english

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"

VS

" 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应该注意哪些其他重要的语言相关设置?

如果您有建议,R的行为与语言有关,以及如何处理,请列出。

2 个答案:

答案 0 :(得分:5)

LC_TIME控制与日期/时间相关的语言整理。出于您的目的,LC_ALL应该可以解决问题:

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

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

答案 1 :(得分:3)

我不熟悉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/)。从本质上讲,如果没有选择一些“真实”的方法而忽视文化差异,那么排序的模糊规则是无法标准化的。通过允许多个校对级别忽略某些细节(如变音符号),创建Case-folding算法(在某些情况下为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)。您可以将其他参数传递给在这些函数末尾创建的collat​​or(http://docs.rexamine.com/R-man/stringi/stri_opts_collator.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'参数设置了所谓的'校对级别'(http://unicode.org/reports/tr10/#Notation)。语言环境由此处指定的语言和国家/地区代码指定(http://userguide.icu-project.org/locale)。您可以使用这些函数来实现自定义排序功能(例如使用这些函数进行比较的快速排序),因为内置函数似乎没有提供任何更改排序谓词的方法。

Update2:或者,甚至比实现自己的排序更好,只需使用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现在位于不同语言环境的不同位置。