正则表达式 – 在Linux上使用方括号在文本中排序R似乎忽略不计

我遇到了一个奇怪的问题,希望有人可以帮助我.这项工作很简单,似乎在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)

以所需顺序返回扇区.

上一篇:TestNG(六) 忽略测试


下一篇:Lucky HDU - 5213 (莫队,容斥)