Pedido personalizado de ordenamiento con ordenación numérica normal en R
Tengo una lista de etiquetas de datos como cadenas, algo así como esto:
data <- c("ABCD 2", "ABCD 3", "WXYZ 1", "WXYZ 5", "WXYZ 3", "WXYZ 4", "ABCD 4", "ABCD 11")
Tenga en cuenta que a veces faltan algunos números, incluido el “1”. Una clasificación normal, por supuesto, coloca las etiquetas ABCD
antes de las etiquetas WXYZ
, y luego coloca ABCD 11
antes que ABCD 2
.
Puedo resolver fácilmente el problema de la numeración con gtools:: mixedsort
. Pero, por motivos de contexto específico del problema, también quiero que las etiquetas WXYZ
vengan antes que las de ABCD
.
Por ejemplo, cuando se ordena la lista data
como lo necesito, debería verse así:
dataSorted <- c("WXYZ 1", "WXYZ 3", "WXYZ 4", "WXYZ 5", "ABCD 2", "ABCD 3", "ABCD 4", "ABCD 11")
Afortunadamente, solo necesito lidiar con estos dos tipos de etiquetas en este momento, pero creo que debería preguntar por una solución general. ¿Hay alguna manera de hacer que gtools:: mixedsort
haga una ordenación alfabética inversa pero una ordenación numérica normal? Si establezco decreasing = TRUE
, también invierte todos los órdenes numéricos.
En este momento, solo estoy usando una lista para forzar el orden, y eso no solo es inelegante, sino que, dado que los números en las etiquetas no tienen un límite superior teórico, también eventualmente fallará.
davy.ai
Sí, puede utilizar
gtools::mixedsort
para ordenar alfabéticamente en reversa pero mantener el orden numérico normal. Para hacer esto, debe establecer el argumentodecreasing
enTRUE
y el argumentoorder
encharacter.only
. Esto asegurará que los caracteres se ordenen en orden inverso, mientras que los números permanecen en su orden normal.Por ejemplo, el siguiente código ordenará sus datos como se desea:
Esto resultará en la siguiente salida: