繁体   English   中英

如何在R中以升序形式订购字符向量

[英]How to order a character vector in ascend form in R

大家好,我正在尝试解决R中的问题。我想读取分配在主文件夹中的multis子文件夹中的许多文件。 然后我使用list.files()来获取子文件夹,但是当我使用该函数时,由于b向量的顺序不同,它会出错。 向量b是下一个:

b=list.files()
b
 [1] "A1"  "A10" "A11" "A12" "A13" "A14" "A15" "A2"  "A3"  "A4"  "A5"  "A6"  "A7" 
[14] "A8"  "A9" 

接下来是它的结构:

chr [1:5] "A1" "A2" "A3" "A4" "A5"

我想将我的b向量设为这种形式:

b
 [1] "A1" "A2"  "A3"  "A4"  "A5"  "A6"  "A7" "A8"  "A9" "A10" "A11" "A12" "A13"
[14] "A14" "A15"

谢谢你的帮助!

有几种方法可以做到这一点。 这是另一个:

b <- c("A1","A10","A11","A12","A13","A14","A15","A2","A3","A4","A5","A6","A7")
b[order(nchar(b), b)]
# [1] "A1"  "A2"  "A3"  "A4"  "A5"  "A6"  "A7"  "A10" "A11" "A12" "A13" "A14" "A15"

gtools::mixedsort专为此设计...

gtools::mixedsort( c("A1","A10","A11","A12","A13","A14","A15","A2","A3","A4","A5","A6","A7") )
[1] "A1"  "A2"  "A3"  "A4"  "A5"  "A6"  "A7"  "A10" "A11" "A12" "A13" "A14" "A15"

感谢@Matthew提供的数据

而不是集中于一个具体的实例,我建议使用现有的工具, mixedsort在gtools打包处理该字母和数字字符两者的不规则宽度。

require(gtools)
vec <- paste0( replicate(40, {
            paste( sample(LETTERS, 3, repl=TRUE),collapse="")}),  
                sample(1:400, 40, repl=TRUE) ) 
mixedsort(vec)
 [1] "ABP256" "ATV361" "ATZ12"  "BKL273" "BOY273" "BQJ242" "CQL129"
 [8] "CXH313" "CXQ249" "DFU116" "FGI305" "HJK249" "ICN4"   "IML75" 
[15] "JDJ309" "JEB93"  "JHF276" "JIY265" "JXK287" "KCQ282" "MAR161"
[22] "MGV185" "MHH72"  "NDJ84"  "NGZ84"  "OIV207" "ORK31"  "PSJ95" 
[29] "QOC178" "QXL344" "QYK285" "RFO98"  "ROC135" "TUL40"  "UBT134"
[36] "UKP14"  "VQL372" "YLG393" "ZLD394" "ZSG180"

如果不存在mixedsort ,那么人类将需要发明它。 这不会完全产生相同的结果,但可能会点亮一条前进的道路:

vec[ order( gsub("[[:digit:]]", "", vec), gsub("[[:alpha:]]", "", vec) )]
 [1] "ABP256" "ATV361" "ATZ12"  "BKL273" "BOY273" "BQJ242" "CQL129"
 [8] "CXH313" "CXQ249" "DFU116" "FGI305" "HJK249" "ICN4"   "IML75" 
[15] "JDJ309" "JEB93"  "JHF276" "JIY265" "JXK287" "KCQ282" "MAR161"
[22] "MGV185" "MHH72"  "NDJ84"  "NGZ84"  "OIV207" "ORK31"  "PSJ95" 
[29] "QOC178" "QXL344" "QYK285" "RFO98"  "ROC135" "TUL40"  "UBT134"
[36] "UKP14"  "VQL372" "YLG393" "ZLD394" "ZSG180"

它的前NUMERICS折叠所有字母字符一起,将order “A12B”“a99z”之前。

如果这是您所拥有的确切数据,则可以按以下方式对其进行排序:

> b[order(as.integer(substr(b,2,3)))]
 [1] "A1"  "A2"  "A3"  "A4"  "A5"  "A6"  "A7"  "A8"  "A9"  "A10" "A11" "A12"
[13] "A13" "A14" "A15"

如果实际数据更复杂,则可能需要多做一些字符串操作,但这是一般的想法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM