我遇到了一个奇怪的问题,希望有人可以帮助我.这项工作很简单,似乎在Windows机器上运行正常,但表现不同.以下是我在Linux机器上的R版本3.0.2中看到的行为
names <- c('lender1', '[cash]', 'acc1')
names
# [1] "lender1" "[cash]" "acc1"
sort(names)
# [1] "acc1" "[cash]" "lender1"
在Windows机器上
names <- c('lender1', '[cash]', 'acc1')
names
# [1] "lender1" "[cash]" "acc1"
sort(names)
# [1] "[cash]" "acc1" "lender1"
似乎在Unix机器上它忽略了[并对文本进行排序.我如何强制它使用[并按照它在Windows平台上的方式进行排序.这些是数据框的列名,需要在第一列中包含[现金].感谢任何帮助
解决方法:
这与您的计算机认为应该执行整理的“区域设置”有关.所以我有
names <- c('lender1', '[cash]', 'acc1')
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 <- function(x) {
olocale <- Sys.setlocale("LC_COLLATE", "C")
on.exit(Sys.setlocale("LC_COLLATE", olocale))
sort(x)
}
此外,在扇区的情况下,看起来这些实际上是因素(表示有限数量级别之一的字符串),在这种情况下使用lvls进行有序表示
sectors <- factor(sectors, levels=lvls)
sort(sectors)
以所需顺序返回扇区.