Jak wykonać sortowanie naturalne (leksykograficzne) w R? [duplikat]

to pytanie ma już odpowiedzi tutaj : jak sortować wektor znaków, w którym elementy zawierają litery i cyfry w R? (6 odpowiedzi) Zamknięte 2 miesiące temu .

Czy istnieje rodzaj naturalny dla R?

Powiedzmy, że miałem taki wektor znaków:

seq.names <- c('abc21', 'abc2', 'abc1', 'abc01', 'abc4', 'abc201', '1b', '1a')

Chciałbym to uporządkować afanumerycznie, więc odzyskam to:

c('1a', '1b', 'abc1', 'abc01', 'abc2', 'abc4', 'abc21', 'abc201')

Czy to gdzieś istnieje, czy powinienem zacząć kodować?

Author: Gregor Thomas, 2010-05-06

2 answers

Nie sądzę, że "sortowanie alfanumeryczne" oznacza to, co myślisz, że to znaczy.

W każdym razie, wygląda na to, że chcesz mixedsort, część gtools .

> install.packages('gtools')
[...]
> require('gtools')
Loading required package: gtools
> n
[1] "abc21"  "abc2"   "abc1"   "abc01"  "abc4"   "abc201" "1b"     "1a"    
> mixedsort(n)
[1] "1a"     "1b"     "abc1"   "abc01"  "abc2"   "abc4"   "abc21"  "abc201"
 42
Author: Nicholas Riley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-13 16:34:09

Sortowanie naturalne jest dostępne w stringr/stringi pakiety z funkcjami str_sort()/stri_sort(). Przełączanie pomiędzy sortowaniem alfanumerycznym i naturalnym jest kontrolowane przez argument 'numeryczny'.

library(stringr)
# library(stringi)

str_sort(seq.names, numeric = TRUE)
# stri_sort(seq.names, numeric = TRUE)

[1] "1a"     "1b"     "abc1"   "abc01"  "abc2"   "abc4"   "abc21"  "abc201"

Funkcja towarzysząca str_order() / stri_order() zwraca indeksy do uporządkowania wektora w (domyślnie) porządku rosnącego:

str_order(seq.names, numeric = TRUE)
# stri_order(seq.names, numeric = TRUE)

[1] 8 7 3 4 2 5 1 6

seq.names[str_order(seq.names, numeric = TRUE)]

[1] "1a"     "1b"     "abc1"   "abc01"  "abc2"   "abc4"   "abc21"  "abc201"
 9
Author: 27 ϕ 9,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-16 22:28:43