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.

¿Por qué stringr::str_order(x, numeric = T) ordena los datos de manera diferente en combinación con dplyr::arrange que con corchetes?

Estoy tratando de organizar un data.frame por una columna de texto que contiene valores numéricos:

foo <- data.frame(x = c("A100", "A1", "A2", "A10", "A11"))

Estoy intentando ordenarlo numéricamente usando stringr::str_order(foo$x, numeric = TRUE) o algo similar. Estoy intentando usar esto con dplyr::arrange pero no se ordena correctamente. Esto es lo que he hecho:

dplyr::arrange(foo, stringr::str_order(x, numeric = T))

En mi máquina, esto devuelve los valores en el orden de A11, A100, A1, A2, A10, en lugar de A1, A2, A10, A11, A100. Este código funciona correctamente:

foo[stringr::str_order(foo$x, numeric = T),]

Esperaría que ambos hagan lo mismo, pero al menos en mi máquina (Windows 10, R versión 4.1.0) y en la de mi hermano (Mac, R versión 4.0.2), no lo hacen.

Mi pregunta es, ¿por qué es diferente la salida? ¿Qué me falta? ¿Hay alguna forma de hacer que str_order y arrange funcionen juntos?

Me gustaría poder ordenar esta columna usando dplyr::arrange para no tener que buscar todos los lugares donde utilicé arrange.

¡Gracias por sus ideas y tiempo!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Según el código y la salida proporcionados, parece que la función dplyr::arrange no reconoce los valores numéricos subyacentes de las cadenas en la columna x de foo. Esto puede ocurrir debido a varias razones, como un tipo de datos incorrecto o problemas de codificación.

    Una solución alternativa posible es convertir la columna x en un factor con niveles ordenados basados en los valores numéricos. Esto se puede hacer utilizando la función forcats::fct_reorder del paquete forcats, de la siguiente manera:

    library(dplyr)
    library(forcats)
    
    foo <- foo %>% 
      mutate(x_ord = fct_reorder(x, as.numeric(stringr::str_extract(x, "\\d+"))))
    
    arrange(foo, x_ord)
    
    # Salida:
         x x_ord
    1  A1      1
    2  A2      2
    3 A10     10
    4 A11     11
    5 A100   100
    

    Aquí, la función fct_reorder crea una nueva columna x_ord extrayendo los valores numéricos de la columna x utilizando stringr::str_extract, convirtiéndolos en tipo numérico con as.numeric y luego reordenando los niveles del factor x según el orden ascendente de estos valores numéricos.

    El data.frame resultante foo se puede ordenar según la nueva columna x_ord utilizando dplyr::arrange.

    Este enfoque garantiza que los valores numéricos en la columna de texto sean reconocidos correctamente por dplyr::arrange y se ordenen en orden ascendente.

Comments are closed.