Сортировать вектор имен файлов в R как windows будет сортировать их? - PullRequest
1 голос
/ 01 февраля 2020

Я хочу отсортировать вектор имен файлов в R, так же, как Windows сортирует их при сортировке по имени (щелчок правой кнопкой мыши -> сортировка по -> имени).

Допустим, у меня есть четыре файла jpg (у меня есть еще). Windows, при сортировке по имени сортирует их в порядке, указанном ниже:

283_20200110_230606.jpg 500_20191203_032950.jpg 10889_20200114_165958.jpg 314368230_20200116_140854.jpg

R при использовании list.files(), отсортирует их так: "10889_20200114_165958.jpg" "283_20200110_230606.jpg" "314368230_20200116_140854.jpg" "500_20191203_032950.jpg"

Кажется, в R character число 1 всегда стоит первым, тогда как Windows сравнивает числа перед первым подчеркиванием.

Есть ли способ сделать их отсортированными таким же образом? Сортировать в R как Windows или в Windows как R?

РЕДАКТИРОВАТЬ:

данные для тестирования:

v1 <- c("10889_20200114_165958.jpg", "283_20200110_230606.jpg", "314368230_20200116_140854.jpg", "500_20191203_032950.jpg")

Ответы [ 3 ]

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

Мы можем использовать mixedsort из gtools

gtools::mixedsort(v1)
#[1] "283_20200110_230606.jpg"       "500_20191203_032950.jpg"       "10889_20200114_165958.jpg"    
#[4] "314368230_20200116_140854.jpg"

данные

v1 <- c("283_20200110_230606.jpg", "314368230_20200116_140854.jpg", 
"500_20191203_032950.jpg", "10889_20200114_165958.jpg")
1 голос
/ 01 февраля 2020

Если у вас установлен Rtools, то:

shell("dir/b | C:\\Rtools\\bin\\sort.exe -g", intern = TRUE)

или если у вас установлен wsl:

shell('wsl ls -1 | sort -g', intern = TRUE)

Обратите внимание, что если естественным порядком является порядок, в котором файлы были созданы, вы могли бы просто сделать это:

shell("dir/b /od", intern = TRUE)
1 голос
/ 01 февраля 2020

Регулярное выражение [0-9]{1,} извлекает любое количество цифр 0-9, предшествующих разрыву _ в векторе имен файлов. Преобразование в число c и сортировка дает желаемый порядок.

library(tidyverse)

f <- c("283_20200110_230606.jpg", "314368230_20200116_140854.jpg", 
       "500_20191203_032950.jpg", "10889_20200114_165958.jpg")

tibble(f) %>% 
  mutate(prefix = as.numeric(str_extract(f, "[0-9]{1,}"))) %>% 
  arrange(prefix) %>% 
  pull(f)

[1] "283_20200110_230606.jpg"      
[2] "500_20191203_032950.jpg"      
[3] "10889_20200114_165958.jpg"    
[4] "314368230_20200116_140854.jpg"
...