studio - superponer graficas en r
rango y orden en R (6)
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
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
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
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
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.
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
> 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