这与您的计算机认为应该执行整理的“区域设置”有关.所以我有
names
Sys.getlocale(category="LC_COLLATE")
## [1] "en_US.UTF-8"
sort(names)
## [1] "acc1" "[cash]" "lender1"
Sys.setlocale(category="LC_COLLATE", locale="C")
## [1] "C"
sort(names)
## [1] "[cash]" "acc1" "lender1"
但是特定的语言环境(以及以交互方式设置它的能力)是特定于系统的. ?Sys.setlocale有附加信息,包括指向RShowDoc(“R-admin”)的指针,R安装和管理手册(第7节).
例如@bhamu包括在下面的评论中,我有
> Sys.setlocale(category="LC_COLLATE", locale="en_US.UTF-8")
[1] "en_US.UTF_8"
> sort(sectors)
[1] "[Cash]" "Consumer Discretionary" "Consumer Staples"
[4] "[Unassigned]"
在en_US-UTF.8中,'[‘字符被视为静默 – 在排序期间被忽略,因此Cash之前排序,Unassigned排序在Consumer之后.虽然为
> Sys.setlocale(category="LC_COLLATE", locale="C")
[1] "C"
> sort(sectors)
[1] "Consumer Discretionary" "Consumer Staples" "[Cash]"
[4] "[Unassigned]"
事情遵循传统的ASCII table和'[‘在大写之后和小写字母字符之前的排序.从语言学的角度来看,不同语言环境的规则是复杂而有趣的(我怀疑在所有语言环境中可以依赖于A-Z之前的0排序,如下面提到的@ bhamu的解决方案所暗示的那样);对于许多计算任务,人们真的想要locale =“C”.
我不确定以下是完全跨平台兼容的(例如,早期版本的?Sys.setlocale()对于这是否适用于Windows不太乐观),但是确保标准排序顺序的方法可能是
mysort
olocale
on.exit(Sys.setlocale("LC_COLLATE", olocale))
sort(x)
}
此外,在扇区的情况下,看起来这些实际上是因素(表示有限数量级别之一的字符串),在这种情况下使用lvls进行有序表示
sectors
sort(sectors)
以所需顺序返回扇区.