Упорядочить список строк по последнему номеру в строке в R - PullRequest
1 голос
/ 20 февраля 2020

У меня есть следующий список:

datalist <- c("20191107_1545_28.xlsx","20191108_1520_95.xlsx",""20191108_1104_99.xlsx"","20200127_1505_28.xlsx", "20200124_1505_41B.xlsx", "20200122_1505_1.xlsx", "20191102_1520_102.xlsx")

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

"20200122_1505_1.xlsx" "20191107_1545_28.xlsx" "20200127_1505_28.xlsx" "20200124_1505_41B.xlsx" "20191108_1520_95.xlsx" "20191108_1520_95.xlsx" Тогда я мог бы просто заказать его как обычно, но, к сожалению, он, конечно, тоже меняет номер. Сначала я попытался разбить строку:

split=str_split(datalist, "_")

, но не знаю, как продолжить. Число, которое я хочу заказать, может состоять из 1, 2 или 3 цифр и также может содержать B (как в примере). Кто-нибудь знает, как это исправить? Спасибо заранее!

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Я думаю, что это помогает. Обратите внимание, он сортирует только по фактическому числу и игнорирует буквы. Он не чувствителен к буквам, прикрепленным в конце последнего числа, поскольку именно так выглядят данные, но регулярное выражение можно изменить в соответствии с любыми потребностями.

library(data.table)
datalist <- c("20191107_1545_28.xlsx","20191108_1520_95.xlsx","20191108_1104_99.xlsx","20200127_1505_28.xlsx", "20200124_1505_41B.xlsx", "20200122_1505_1.xlsx", "20191102_1520_102.xlsx")


dt <- data.table('datalist' = datalist)
dt[, 'num1' := as.numeric(gsub(pattern = '(\\d{1,10})(_)(\\d{1,10})(_)(\\d{1,10})(.*)', x = datalist, replacement = '\\1'))]
dt[, 'num2' := as.numeric(gsub(pattern = '(\\d{1,10})(_)(\\d{1,10})(_)(\\d{1,10})(.*)', x = datalist, replacement = '\\3'))]
dt[, 'num3' := as.numeric(gsub(pattern = '(\\d{1,10})(_)(\\d{1,10})(_)(\\d{1,10})(.*)', x = datalist, replacement = '\\5'))]

setkey(dt, num3, num1)
print(dt$datalist)

Редактировать: забыл сделать приведение к цифре c. Исправлено.

0 голосов
/ 20 февраля 2020

Один stringr параметр может быть:

datalist[str_order(str_extract_all(datalist, "\\d+", simplify = TRUE)[, 3], numeric = TRUE)]

[1] "20200122_1505_1.xlsx"   "20191107_1545_28.xlsx"  "20200127_1505_28.xlsx" 
[4] "20200124_1505_41B.xlsx" "20191108_1520_95.xlsx"  "20191108_1104_99.xlsx" 
[7] "20191102_1520_102.xlsx"

Или более гибкий вариант:

datalist[str_order(sapply(str_extract_all(datalist, "\\d+"), tail, 1), numeric = TRUE)]

Если вы действительно хотите заказать по нескольким номерам, с добавлением dplyr:

bind_cols(datalist = datalist, 
          as.data.frame(str_extract_all(datalist, "\\d+", simplify = TRUE))) %>%
 mutate_at(vars(starts_with("V")), ~ as.numeric(as.character(.))) %>%
 arrange(V3, V1)

  datalist                     V1    V2    V3
  <chr>                     <dbl> <dbl> <dbl>
1 20200122_1505_1.xlsx   20200122  1505     1
2 20191107_1545_28.xlsx  20191107  1545    28
3 20200127_1505_28.xlsx  20200127  1505    28
4 20200124_1505_41B.xlsx 20200124  1505    41
5 20191108_1520_95.xlsx  20191108  1520    95
6 20191108_1104_99.xlsx  20191108  1104    99
7 20191102_1520_102.xlsx 20191102  1520   102
...