rango y orden en R

Tengo problemas para entender la diferencia entre el rank la función R y el order función R. parecen producir el mismo resultado:

 > rank(c(10,30,20,50,40)) [1] 1 3 2 5 4 > order(c(10,30,20,50,40)) [1] 1 3 2 5 4 

¿Podría alguien arrojar algo de luz sobre esto para mí? Gracias

 > set.seed(1) > x < - sample(1:50, 30) > x [1] 14 19 28 43 10 41 42 29 27 3 9 7 44 15 48 18 25 33 13 34 47 39 49 4 30 46 1 40 20 8 > rank(x) [1] 9 12 16 25 7 23 24 17 15 2 6 4 26 10 29 11 14 19 8 20 28 21 30 3 18 27 1 22 13 5 > order(x) [1] 27 10 24 12 30 11 5 19 1 14 16 2 29 17 9 3 8 25 18 20 22 28 6 7 4 13 26 21 15 23 

rank devuelve un vector con el “rango” de cada valor. el número en la primera posición es el noveno más bajo. order devuelve los índices que pondrían el vector inicial x en orden.

El valor 27 de x es el más bajo, por lo que 27 es el primer elemento de order(x) – y si observas el rank(x) , el elemento 27 es 1 .

 > x[order(x)] [1] 1 3 4 7 8 9 10 13 14 15 18 19 20 25 27 28 29 30 33 34 39 40 41 42 43 44 46 47 48 49 

Siempre me resulta confuso pensar en la diferencia entre los dos, y siempre pienso, “¿cómo puedo hacer para order usando el rank “?

Comenzando con el ejemplo de Justin:

Ordenar usando rango:

 ## Setup example to match Justin's example set.seed(1) x < - sample(1:50, 30) ## Make a vector to store the sorted x values xx = integer(length(x)) ## i is the index, ir is the ith "rank" value i = 0 for(ir in rank(x)){ i = i + 1 xx[ir] = x[i] } all(xx==x[order(x)]) [1] TRUE 

rank es más complicado y no necesariamente un índice (entero):

 > rank(c(1)) [1] 1 > rank(c(1,1)) [1] 1.5 1.5 > rank(c(1,1,1)) [1] 2 2 2 > rank(c(1,1,1,1)) [1] 2.5 2.5 2.5 2.5 

Resultó que este era un caso especial e hizo que las cosas fueran confusas. Explico a continuación para cualquier persona interesada:

rank devuelve el orden de cada elemento en una lista ascendente

order devuelve el índice que tendría cada elemento en una lista ascendente

como está indicado por? order () en el prompt R, el orden simplemente devuelve una permutación que ordena el vector original en orden ascendente / descendente. supongamos que tenemos un vector

 A< -c(1,4,3,6,7,4); A.sort<-sort(A); 

entonces

 order(A) == match(A.sort,A); rank(A) == match(A,A.sort); 

además, encuentro que esa orden tiene la siguiente propiedad (no validada teóricamente):

 1 order(A)∈(1,length(A)) 2 order(order(order(....order(A)....))):if you take the order of A in odds number of times, the results remains the same, so as to even number of times. 

En lenguaje sencillo, el order proporciona el lugar / posición real de un valor después de ordenar los valores Por ejemplo:

 a< -c(3,4,2,7,8,5,1,6) sort(a) [1] 1 2 3 4 5 6 7 8 

La posición de 1 en a es 7. De manera similar, la posición de 2 en a es 3.

 order(a) [1] 7 3 1 2 6 8 4 5