2010-11-26 14 views
14
df.sorted <- c("binned_walker1_1.grd", "binned_walker1_2.grd", "binned_walker1_3.grd", 
    "binned_walker1_4.grd", "binned_walker1_5.grd", "binned_walker1_6.grd", 
    "binned_walker2_1.grd", "binned_walker2_2.grd", "binned_walker3_1.grd", 
    "binned_walker3_2.grd", "binned_walker3_3.grd", "binned_walker3_4.grd", 
    "binned_walker3_5.grd", "binned_walker4_1.grd", "binned_walker4_2.grd", 
    "binned_walker4_3.grd", "binned_walker4_4.grd", "binned_walker4_5.grd", 
    "binned_walker5_1.grd", "binned_walker5_2.grd", "binned_walker5_3.grd", 
    "binned_walker5_4.grd", "binned_walker5_5.grd", "binned_walker5_6.grd", 
    "binned_walker6_1.grd", "binned_walker7_1.grd", "binned_walker7_2.grd", 
    "binned_walker7_3.grd", "binned_walker7_4.grd", "binned_walker7_5.grd", 
    "binned_walker8_1.grd", "binned_walker8_2.grd", "binned_walker9_1.grd", 
    "binned_walker9_2.grd", "binned_walker9_3.grd", "binned_walker9_4.grd", 
    "binned_walker10_1.grd", "binned_walker10_2.grd", "binned_walker10_3.grd") 

Uno esperaría que el orden de este vector fuera 1:length(df.sorted), pero parece que no es el caso. Parece que R ordena internamente el vector de acuerdo con su lógica, pero se esfuerza por mostrarlo de la forma en que se creó (y se ve en la salida).R ordena un vector por su propia cuenta - ¡chico malo!

order(df.sorted) 
[1] 37 38 39 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 
[26] 23 24 25 26 27 28 29 30 31 32 33 34 35 36 

¿Hay una manera de "restablecer" el orden a 1:length(df.sorted)? De esta forma, el orden y la salida del vector estarían sincronizados.

Respuesta

12

constructo como un factor ordenada:

> df.new <- ordered(df.sorted,levels=df.sorted) 
> order(df.new) 
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... 

EDIT:

Después @DWins comentario, quiero añadir que ni siquiera es nessecary para que sea un factor ordenado, justo un factor es suficiente si proporciona el orden correcto de niveles:

>  df.new2 <- factor(df.sorted,levels=df.sorted) 
>  order(df.new) 
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... 

La diferencia será notable e cuando usa esos factores en un análisis de regresión, pueden tratarse de manera diferente. La ventaja de los factores ordenados es que le permiten usar operadores de comparación como < y>. Esto hace que la vida a veces sea mucho más fácil.

> df.new2[5] < df.new2[10] 
[1] NA 
Warning message: 
In Ops.factor(df.new[5], df.new[10]) : < not meaningful for factors 

> df.new[5] < df.new[10] 
[1] TRUE 
10

¿No es esto simplemente lo mismo que obtienes con todos los pantalones cortos lexicográficos (como por ejemplo ls en los directorios) donde walker10_foo sorts es mayor que walker1_foo?

La forma más fácil, en mi libro, es utilizar una cantidad constante de dígitos, es decir, cambiaría a binned_walker01_1.grd y así sucesivamente insertando un 0 para los conteos de un dígito.

+1

A veces los datos "llegan", en lugar de ser "masilla en tus manos" desde el principio. Es por eso que nunca descartaría el valor de Greg Warnes mixedsort(). –

15

Uso del mixedsort (o) mixedorder funciones en gtools paquete:

require(gtools) 
mixedorder(df.sorted) 
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 
[28] 28 29 30 31 32 33 34 35 36 37 38 39 
+0

+1: buena herramienta, aún no lo sabía. –

+0

+1: no estaba al tanto de esa función, DWin. –

+0

En realidad, mi df.sorted es el resultado de gtools :: mixedsort. :) –

7

En respuesta al comentario de Dwin sobre la respuesta de Dirk: los datos son siempre masilla en sus manos. "Esto es R. No hay si. Solo cómo". - Simon Blomberg

Puede añadir 0 así:

df.sorted <- gsub("(walker)([[:digit:]]{1}_)", "\\10\\2", df.sorted) 

Si necesita añadir 00, lo haces de esta manera:

df.sorted <- gsub("(walker)([[:digit:]]{1}_)", "\\10\\2", df.sorted) 
df.sorted <- gsub("(walker)([[:digit:]]{2}_)", "\\10\\2", df.sorted) 

... y así sucesivamente.

+1

Sí, se trata de cómo. Solo soy un aprendiz. Quizás algún día pueda hacer mi propio sable de luz. Hasta entonces usaré los de otros. –

+1

@DWin ¿Pero cómo aprenderás a hacer la tuya si solo usas la de los demás? ;-) –

Cuestiones relacionadas