Упорядочение сложного вектора строки для получения упорядоченного фактора

Я работаю со строковым вектором со структурой, соответствующей приведенной ниже:

messy_vec <- c("0 - 9","100 - 150","21 - abc","50 - 56","70abc - 80")

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

messy_vec_fac <- as.factor(messy_vec)

будет производить

> messy_vec_fac
[1] 0 - 9      100 - 150  21 - abc   50 - 56    70abc - 80
Levels: 0 - 9 100 - 150 21 - abc 50 - 56 70abc - 80

тогда как я заинтересован в получении вектора характеристик:

[1] 0-9 100 - 150 21 - abc 50 - 56 70abc - 80

Уровни: 0 - 921 - abc 50 - 56 70abc - 80 100 - 150

Как указано, порядок уровней соответствует порядку:

0 21 50 70 100

которые являются первыми цифрами, полученными из элементовгрязный вектор.

Боковые точки

Это не имеет решающего значения для искомого решения, но было бы хорошо, если бы предлагаемое решение не принимало максимальное количество цифр в первой части векторных элементов. Может произойти следующее:

8787abc - 89898 deff - в этом случае значение8787 следует использовать для подтверждения заказа001 def - 1111 OHMG - в этом случае значение1 следует использовать для подтверждения заказаМожно смело предположить, что все элементы вектора имеют- строки:[[:space:]]-[[:space:]]Дублирующиеся значения встречаютсяПравки

После очень полезного предложения от CathG я пытаюсь втиснуть это решение в большееdplyr синтаксис

# ... %>%
  mutate(very_needed_factor= factor(messy_vec,
                                      levels = messy_vec[
                                        order(
                                          as.numeric(
                                            sub("(\\d+)[^\\d]* - .*", "\\1",
                                                messy_vec)))]))
# %>% ...

Но я продолжаю получать следующую ошибку:

Warning messages:
1: In order(as.numeric(sub("(\\d+)[^\\d]* - .*", "\\1", c("12-14",  :
  NAs introduced by coercion
2: In `levels<-`(`*tmp*`, value = if (nl == nL) as.character(labels) else paste0(labels,  :
  duplicated levels in factors are deprecated

Ответы на вопрос(2)

Ваш ответ на вопрос