[英]How to make a character vector with known occurences of specific values in order in 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.