ранг и порядок в 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
может кто-нибудь пролить свет на это для меня? Спасибо
6 ответов
> 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
возвращает вектор с "чином" каждого значения. число на первой позиции-9-е самое низкое. 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
мне всегда кажется глупым думать о разнице между ними, и я всегда думаю: "как я могу добраться до order
С помощью rank
"?
начиная с примера Джастина:
порядок с использованием ранга:
## 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
сложнее и не обязательно индекс (целое число):
> 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
Как оказалось, это был особый случай и сделал все запутанно. Я объясню ниже для всех, кто заинтересован:
rank
возвращает порядок каждого элемента в списке по возрастанию
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.
на непрофессиональном языке,order
дает фактическое место / положение значения после сортировки значений
Например:
a<-c(3,4,2,7,8,5,1,6)
sort(a) [1] 1 2 3 4 5 6 7 8
позиция 1
на a
is 7. аналогичная позиция 2
на a
is 3.
order(a) [1] 7 3 1 2 6 8 4 5