j'ai du mal à comprendre la différence entre la fonction R rank
et la fonction R order
. ils semblent produire le même résultat:
> 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
Quelqu'un pourrait-il m'éclairer un peu? Merci
> 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
renvoie un vecteur avec le "rang" de chaque valeur. le nombre en première position est le 9ème plus bas. order
renvoie les index qui placeraient le vecteur initial x
dans l'ordre.
La 27ème valeur de x
est la plus basse, donc 27
Est le premier élément de order(x)
- et si vous regardez rank(x)
, le 27ème élément est 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
Je trouve toujours déroutant de penser à la différence entre les deux et je me dis toujours: "comment puis-je accéder à order
avec rank
"?
En commençant par l'exemple de Justin:
## 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
est plus compliqué et n'est pas nécessairement un index (entier):
> 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
Il s’est avéré qu’il s’agissait d’un cas spécial qui a rendu les choses confuses. J'explique ci-dessous pour toute personne intéressée:
rank
retourne l'ordre de chaque élément dans une liste ascendante
order
renvoie l'index que chaque élément aurait dans une liste ascendante
En langage simple, order
donne la position actuelle d'une valeur après avoir trié les valeurs, par exemple:
a<-c(3,4,2,7,8,5,1,6)
sort(a) [1] 1 2 3 4 5 6 7 8
La position de 1
dans a
vaut 7. de même que la position de 2
dans a
vaut 3.
order(a) [1] 7 3 1 2 6 8 4 5
comme indiqué par? order () dans l'invite R, order renvoie simplement une permutation qui classe le vecteur d'origine en ordre croissant/décroissant. supposons que nous ayons un vecteur
A<-c(1,4,3,6,7,4);
A.sort<-sort(A);
puis
order(A) == match(A.sort,A);
rank(A) == match(A,A.sort);
de plus, je trouve que cet ordre a la propriété suivante (non validée théoriquement):
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.