2015-05-08 3 views
3

У меня есть список имен файлов, которые нужно открыть. формат выглядит следующим образом.R сортировка строки по номеру внутри

'xxxxx_xxxxxx 00.02.xls' 

первый 00 относится к году, второй 02 относится к месяцу.

Есть ли все, чтобы отсортировать этот список первым с индексом года, чем индекс месяца.

+0

@JabberwockyDecompiler язык R (из тега). – Gregor

ответ

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 заключается в том, что она сообщает вам, что она соответствует, и создает столбцы для токенов, которые вы положили в скобки. Затем вы можете подмножать эти столбцы, как любой другой фрейм данных.

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" 
3

Если всегда есть 13 символов до двухлетних цифр, то вы можете сделать это (предполагая, что ваш вектор имен файлов называется x):

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

Блестящий! Я буду помнить об этом в будущем ... но в моем случае длина имени файла может измениться ... – 126

+2

Вы также используете регулярное выражение внутри 'order', что по сути является вариацией ответа @ plafort. Например: 'x [order (gsub (" (\\ d {2}. \\ d {2}) "," \\ 1 ", x))]'. – eipi10

+0

@eipi этот код не работает. Нуждается в проверке. –

Смежные вопросы