R排序在Linux上用方括号在文本中似乎忽略

bha*_*amu 3 regex linux sorting ignore r

我遇到了一个奇怪的问题,希望有人可以帮助我.这项工作很简单,似乎在Windows机器上运行正常,但表现不同.以下是我在Linux机器上的R版本3.0.2中看到的行为

names <- c('lender1', '[cash]', 'acc1')
names
# [1] "lender1" "[cash]"  "acc1"
sort(names)
# [1] "acc1"    "[cash]"  "lender1"
Run Code Online (Sandbox Code Playgroud)

在Windows机器上

names <- c('lender1', '[cash]', 'acc1')
names
# [1] "lender1" "[cash]"  "acc1"   
sort(names)
# [1] "[cash]"  "acc1"    "lender1"
Run Code Online (Sandbox Code Playgroud)

似乎在Unix机器上它忽略了[并对文本进行排序.我如何强制它使用[并按照它在Windows平台上的方式进行排序.这些是数据框的列名,需要在第一列中包含[现金].感谢任何帮助

Mar*_*gan 6

这与您的计算机认为应该执行整理的"区域设置"有关.所以我有

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"
Run Code Online (Sandbox Code Playgroud)

但是特定的语言环境(以及以交互方式设置它的能力)是特定于系统的.?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]"     
Run Code Online (Sandbox Code Playgroud)

在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]" 
Run Code Online (Sandbox Code Playgroud)

事物遵循传统的ASCII表和'['在大写之后和小写字母字符之前排序.从语言学的角度来看,不同语言环境的规则是复杂而有趣的(我怀疑0在所有语言环境中可以依赖于AZ之前的排序,正如@ bhamu在下面提到的解决方案所暗示的那样); 对于许多计算任务,人们真的想要locale ="C".

我不确定以下是完全跨平台兼容的(例如,早期版本?Sys.setlocale()对于这是否适用于Windows不太乐观),但确保标准排序顺序的方法可能是

mysort <- function(x) {
    olocale <- Sys.setlocale("LC_COLLATE", "C")
    on.exit(Sys.setlocale("LC_COLLATE", olocale))
    sort(x)
}
Run Code Online (Sandbox Code Playgroud)

此外,在sectors它看起来这些实际上是因素(字符串表示有限数量的级别之一),在这种情况下lvls用于有序表示

sectors <- factor(sectors, levels=lvls)
sort(sectors)
Run Code Online (Sandbox Code Playgroud)

以所需顺序返回扇区.