es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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á.

Tags:  ,

Answer

  1. Avatar for 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 argumento decreasing en TRUE y el argumento order en character.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:

    dataSorted <- gtools::mixedsort(data, decreasing = TRUE, order = "character.only")
    

    Esto resultará en la siguiente salida:

    dataSorted
    [1] "WXYZ 1"  "WXYZ 3"  "WXYZ 4"  "WXYZ 5"  "ABCD 2"  "ABCD 3"  "ABCD 4"  "ABCD 11"
    

Comments are closed.