Ordenando um vetor de cadeia complexo para obter um fator ordenado

Estou trabalhando com um vetor de string com uma estrutura correspondente à abaixo:

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

Eu estou olhando para mudar uma classe deste vetor para fator queos níveis seriam ordenados de acordo com o (s) primeiro (s) dígito (s). O código:

messy_vec_fac <- as.factor(messy_vec)

produziria

> 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

enquanto eu estou interessado em obter vetor de características:

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

Níveis: 0 - 921 - abc 50 - 56 70abc - 80 100 - 150

Conforme indicado, a ordem dos níveis corresponde à ordem:

0 21 50 70 100

quais são os primeiros dígitos derivados dos elementos dovetor bagunçado.

Pontos laterais

Isso não é crucial para a solução procurada, mas seria bom se a solução proposta não assumisse o número máximo de dígitos na primeira parte dos elementos do vetor. Pode acontecer que os seguintes valores ocorram:

8787abc - 89898 deff - neste caso, o valor8787 deve ser usado para afirmar a ordem001 def - 1111 OHMG$20Eu estou olhando para mudar uma classe deste vetor para fator que21$Pode-se supor com segurança que todos os elementos vetoriais tenham- cordas:[[:space:]]-[[:space:]]Valores duplicados ocorremEditar% s

Seguindo uma sugestão muito útil da CathG, estou tentando colocar esta solução em umadplyr sintaxe

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

Mas continuo recebendo o seguinte erro:

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

questionAnswers(2)

yourAnswerToTheQuestion