classifica e ordine in R

Ho difficoltà a capire la differenza tra il rank della funzione R e l’ order funzione R. sembrano produrre lo stesso risultato:

 > 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 

Qualcuno potrebbe far luce su questo per me? Grazie

 > 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 restituisce un vettore con il “rank” di ciascun valore. il numero nella prima posizione è il 9 ° più basso. order restituisce gli indici che inseriscono il vettore iniziale x nell’ordine.

Il 27esimo valore di x è il più basso, quindi 27 è il primo elemento di order(x) – e se guardi a rank(x) , il 27esimo elemento è 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 

Trovo sempre confuso pensare alla differenza tra i due, e penso sempre, “come posso order usando il rank “?

A partire dall’esempio di Justin:

Ordinare usando il 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 è più complicato e non necessariamente un indice (intero):

 > 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 

Come si è scoperto questo era un caso speciale e ha reso le cose confuse. Spiego di seguito per chiunque sia interessato:

rank restituisce l’ordine di ciascun elemento in una lista crescente

order restituisce l’indice che ogni elemento avrebbe in una lista crescente

come indicato da? order () in R prompt, ordinare solo restituire una permutazione che ordina il vettore originale in ordine ascendente / discendente. supponiamo di avere un vettore

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

poi

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

inoltre, trovo che l'ordine abbia la seguente proprietà (non validata teoricamente):

 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. 

Nella lingua di un laico, l’ order fornisce la posizione / posizione effettiva di un valore dopo aver ordinato i valori Ad esempio:

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

La posizione di 1 in a è 7. Analogamente, la posizione di 2 in a è 3.

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