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 lateraisIsso 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% sSeguindo 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