¿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!
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 columnax
defoo
. 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ónforcats::fct_reorder
del paqueteforcats
, de la siguiente manera:Aquí, la función
fct_reorder
crea una nueva columnax_ord
extrayendo los valores numéricos de la columnax
utilizandostringr::str_extract
, convirtiéndolos en tipo numérico conas.numeric
y luego reordenando los niveles del factorx
según el orden ascendente de estos valores numéricos.El data.frame resultante
foo
se puede ordenar según la nueva columnax_ord
utilizandodplyr::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.