Подтвердить что ты не робот

Ранг и порядок в R

Мне трудно понять разницу между функцией R rank и функцией R order. они, похоже, производят один и тот же вывод:

> 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

Может ли кто-нибудь пролить свет на это для меня? Спасибо

4b9b3361

Ответ 1

> 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 возвращает вектор с "рангом" каждого значения. число в первой позиции - девятое. order возвращает индексы, которые поместили бы начальный вектор x в порядок.

27-е значение x является самым низким, поэтому 27 является первым элементом order(x) - и если вы посмотрите на rank(x), то 27-й элемент 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

Ответ 2

Мне всегда сложно понять разницу между ними, и я всегда думаю: "Как я могу добраться до order с помощью rank"?

Начиная с примера Джастина:

Заказ с использованием ранга:

## Setup example to match Justin 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

Ответ 3

rank более сложный и необязательный индекс (целое число):

> 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

Ответ 4

Как выяснилось, это был особый случай, и все это путало. Я объясню ниже для всех, кого это интересует:

rank возвращает порядок каждого элемента в восходящем списке

order возвращает индекс, который будет иметь каждый элемент в восходящем списке

Ответ 5

как указано выражением? order() в строке R, order просто верните перестановку, сортирующую исходный вектор в порядке возрастания/убывания. предположим, что мы имеем вектор

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

затем

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

Кроме того, я обнаружил, что порядок имеет следующее свойство (теоретически не подтвержденное):

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.

Ответ 6

На непрофессионале, order дает фактическое место/положение значения после сортировки значений. Например:

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

Положение 1 в a равно 7. Аналогично положение 2 в a равно 3.

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