R中对一个字符串向量进行不区分大小写的排序

7

我有一个如下的向量:

 mylist <- c("MBT.LN.ID", "ISA51VG.LN.ID", "R848.LN.ID", "sHz.LN.ID", "FK565.LN.ID",
    "bCD.LN.ID", "MALP2s.LN.ID", "ADX.LN.ID", "AddaVax.LN.ID", "FCA.LN.ID",
    "Pam3CSK4.LN.ID", "D35.LN.ID", "ALM.LN.ID", "K3.LN.ID", "K3SPG.LN.ID",
    "MPLA.LN.ID", "DMXAA.LN.ID", "cGAMP.LN.ID", "Poly_IC.LN.ID",
    "cdiGMP.LN.ID")

我希望按不区分大小写的方式对它们进行字母排序。
预期输出如下:
 [1] "AddaVax.LN.ID"  "ADX.LN.ID"      "ALM.LN.ID"      "bCD.LN.ID"      "cdiGMP.LN.ID"   "cGAMP.LN.ID"   
 [7] "D35.LN.ID"      "DMXAA.LN.ID"    "FCA.LN.ID"      "FK565.LN.ID"    "ISA51VG.LN.ID"  "K3.LN.ID"      
[13] "K3SPG.LN.ID"    "MALP2s.LN.ID"   "MBT.LN.ID"      "MPLA.LN.ID"     "Pam3CSK4.LN.ID" "Poly_IC.LN.ID" 
[19] "R848.LN.ID"     "sHz.LN.ID"   

我尝试了这个方法,但失败了(使用 R.3.2.0 alpha):
> sort(mylist)
 [1] "ADX.LN.ID"      "ALM.LN.ID"      "AddaVax.LN.ID"  "D35.LN.ID"
 [5] "DMXAA.LN.ID"    "FCA.LN.ID"      "FK565.LN.ID"    "ISA51VG.LN.ID"
 [9] "K3.LN.ID"       "K3SPG.LN.ID"    "MALP2s.LN.ID"   "MBT.LN.ID"
[13] "MPLA.LN.ID"     "Pam3CSK4.LN.ID" "Poly_IC.LN.ID"  "R848.LN.ID"
[17] "bCD.LN.ID"      "cGAMP.LN.ID"    "cdiGMP.LN.ID"   "sHz.LN.ID"

3
sort 命令的输出结果会受到所在区域的影响: https://dev59.com/-Gw05IYBdhLWcg3weBhF#7229428 - user3710546
1
我使用 sort(mylist) 得到了预期的输出。你的语言环境是什么? - Cath
@CathG:LANG=en_US.UTF-8 LC_CTYPE="C" LC_NUMERIC="C" LC_TIME="C" LC_COLLATE="C" LC_MONETARY="C" LC_MESSAGES="C" LC_PAPER="C" LC_NAME="C" LC_ADDRESS="C" LC_TELEPHONE="C" LC_MEASUREMENT="C" LC_IDENTIFICATION="C" LC_ALL=C - pdubois
也许这就是它的来源,可以看看Pascal提供的链接。order会发生同样的事情吗?(mylist[order(mylist)]) - Cath
@Pascal,你没有这样做。你提供了一个链接,我以为你是在建议它作为可能的解决方案。 - David Arenburg
显示剩余3条评论
3个回答

14

尝试

mylist[order(tolower(mylist))]

1
@DavidArenburg,是的,我不想改变我的本地设置,但我想知道它是否有效(感谢您的帮助)。因此,Collate=C 会使排序和排序区分大小写。 - Cath

6

正如 @Pascal 所指出的那样,这在 help(Comparison) 中有记录,而且 sort 是本地特定的。一种选择是切换您的本地设置(例如 Sys.setlocale("LC_TIME", "us")),但这可能不方便。另一个选择是使用 gtools::mixedsort,因为它也可以处理包含数字的字符串。

library(gtools)
mixedsort(mylist)

# [1] "AddaVax.LN.ID"  "ADX.LN.ID"      "ALM.LN.ID"      "bCD.LN.ID"      "cdiGMP.LN.ID"   "cGAMP.LN.ID"    "D35.LN.ID"      "DMXAA.LN.ID"    "FCA.LN.ID"      "FK565.LN.ID"   
# [11] "ISA51VG.LN.ID"  "K3.LN.ID"       "K3SPG.LN.ID"    "MALP2s.LN.ID"   "MBT.LN.ID"      "MPLA.LN.ID"     "Pam3CSK4.LN.ID" "Poly_IC.LN.ID"  "R848.LN.ID"     "sHz.LN.ID"

4
> library(searchable)
> sort(ignore.case(mylist))
 [1] "AddaVax.LN.ID"  "ADX.LN.ID"      "ALM.LN.ID"      "bCD.LN.ID"      "cdiGMP.LN.ID"  
 [6] "cGAMP.LN.ID"    "D35.LN.ID"      "DMXAA.LN.ID"    "FCA.LN.ID"      "FK565.LN.ID"   
[11] "ISA51VG.LN.ID"  "K3.LN.ID"       "K3SPG.LN.ID"    "MALP2s.LN.ID"   "MBT.LN.ID"     
[16] "MPLA.LN.ID"     "Pam3CSK4.LN.ID" "Poly_IC.LN.ID"  "R848.LN.ID"     "sHz.LN.ID" 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接