Как упорядочить массив символов по номерам, которые он содержит - PullRequest
0 голосов
/ 26 марта 2020

Я хотел бы заказать следующий вектор chr:

x=c("class 1", "class 2", "class 4", "class 7", "class 5", "class 3", "class 6",
"class 10", "class 9", "class 11", "class 8", "class 12", "class 21")

в соответствии с числами, которые появляются в символах. Например, в этом случае желаемый результат:

class 1, class 2, class 3, class 4, class 5, class 6, class 7, class 8, class 9, class 10, class 11
class 12, class 21

Я пробовал с:

x[order(x)]

, но получил другой результат:

> x[order(x)]
 [1] "class 1"  "class 10" "class 11" "class 12" "class 2"  "class 21" "class 3" 
 [8] "class 4"  "class 5"  "class 6"  "class 7"  "class 8"  "class 9" 

Ответы [ 2 ]

1 голос
/ 26 марта 2020

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

Существует несколько вариантов решения этой проблемы:

library(stringr)

str_sort(x, numeric = TRUE)
[1] "class 1"  "class 2"  "class 3"  "class 4"  "class 5"  "class 6"  "class 7"  "class 8"  "class 9"  "class 10" "class 11" "class 12" "class 21"

Или

library(gtools)

mixedsort(x)
[1] "class 1"  "class 2"  "class 3"  "class 4"  "class 5"  "class 6"  "class 7"  "class 8"  "class 9"  "class 10" "class 11" "class 12" "class 21"

Или, не используя другой пакет, уберите "класс" и используйте результат чисел c для сортировки:

values <- as.numeric(gsub("class", "", x))
x[order(values)]
[1] "class 1"  "class 2"  "class 3"  "class 4"  "class 5"  "class 6"  "class 7"  "class 8"  "class 9"  "class 10" "class 11" "class 12" "class 21"
0 голосов
/ 26 марта 2020

Это потому, что x является вектором класса "character", а элементы (строки) расположены в алфавитном порядке. Извлечение числа из строк и преобразование их в число c тип

y <- as.integer(substr(x, 7,8))
# y has the same order that x
# sort integers (numeric order) and match positions of unordered intergers
# match returns indexes of y ordered by sort(y)
x[match(y, sort(y))]
# Output is:
# [1] "class 1"  "class 2"  "class 7"  "class 6"  "class 5"  "class 4"  "class 3"  "class 11" "class 9"  "class 8"  "class 10" "class 12"
# [13] "class 21"
...