R按内部数字排序

时间:2015-05-08 15:25:54

标签: r string sorting

我有一个要打开的文件名列表。格式如下。

'xxxxx_xxxxxx 00.02.xls'

第一个00表示年份,第二个02表示月份。

无论如何,首先使用年度索引对该列表进行排序,而不是月份索引。

2 个答案:

答案 0 :(得分:3)

如果在两年数字之前总是有13个字符,那么你可以这样做(假设你的文件名向量被称为x):

x[order(substr(x,14,18))]

答案 1 :(得分:2)

如果文件名中的字符数量可能会发生变化,则正则表达式可能会为您找到年份和月份。我喜欢str_match包中的stringr

library(stringr)
extract <- str_match(vec, "([0-9]{2})\\.([0-9]{2}).xls")
vec[order(rank(extract[,2]))]

这样,如果您决定有一天按月订购,则可以将最后一行从2更改为3

如果您希望年份下降,请向其添加rev。像这样,vec[rev(order(rank(extract[,2])))]

关于str_match的好处是,它告诉你它匹配的内容,并为你放入parantheses中的标记创建列。然后,您可以像其他任何数据框一样对这些列进行子集化。

extract
     [,1]        [,2] [,3]
[1,] "07.02.xls" "07" "02"
[2,] "15.12.xls" "15" "12"
[3,] "01.02.xls" "01" "02"

实施例

vec <- c("xxxxxxxx_xxxxxx 07.02.xls", "xxxxx_xxx 15.12.xls", "xxxxx_xxxxxx 01.02.xls")
extract <- str_match(vec, "([0-9]{2})\\.([0-9]{2}).xls")
vec[order(rank(extract[,2]))]
[1] "xxxxx_xxxxxx 01.02.xls"    "xxxxxxxx_xxxxxx 07.02.xls" "xxxxx_xxx 15.12.xls" 

#or reversed

vec[rev(order(rank(extract[,2])))]
[1] "xxxxx_xxx 15.12.xls"       "xxxxxxxx_xxxxxx 07.02.xls" "xxxxx_xxxxxx 01.02.xls"