Geg*_*naV 2 sorting r non-english
任务是按照英文字母对美国州名缩写进行排序.但我注意到,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"
Run Code Online (Sandbox Code Playgroud)
与
"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"
Run Code Online (Sandbox Code Playgroud)
因此,状态的排序缩写的顺序也不同(注意最后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"
Run Code Online (Sandbox Code Playgroud)
我试过了Sys.setlocale("LC_TIME","English_United States.1252").它有助于在情节,图表和数字中获得工作日的英文名称.
现在我需要帮助以"英语"方式正确排序.
如果你有建议,R的行为与语言有关,以及如何处理,请列出.
我对 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)
Run Code Online (Sandbox Code Playgroud)
之后您可以使用这些类型的函数(http://docs.rexamine.com/R-man/stringi/stri_compare.html)。您可以将其他参数传递给在这些函数(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')
Run Code Online (Sandbox Code Playgroud)
例如,上面的“强度”参数设置了所谓的“整理级别”(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"
Run Code Online (Sandbox Code Playgroud)
请注意,WV 和 WY 现在在不同的语言环境中处于不同的位置。
LC_TIME控制日期/时间相关的语言整理.为了您的目的,LC_ALL应该做的诀窍:
Sys.setenv('LC_ALL', 'English_United States.1252')
sort(letters)
Run Code Online (Sandbox Code Playgroud)
但请注意,这些设置是特定于操作系统的.例如,上述内容不适用于典型的Unix系统.相反,字符串'en_US.UTF-8'通常是一个很好的设置 - 但在Windows下,这本身可能会带来问题,因为R的Unicode支持在Windows上是粗略的.
| 归档时间: |
|
| 查看次数: |
276 次 |
| 最近记录: |