R中的排名和排序

58

我不太明白R语言中rank函数和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

有人能为我解释一下吗? 谢谢


3
一篇关于此事的博客文章链接为:http://www.portfolioprobe.com/2012/07/26/r-inferno-ism-order-is-not-rank/注:原文中的“R”指的是一种编程语言。 - Patrick Burns
1
我还写了一篇关于这个问题的博客文章,特别是我尝试解释为什么 OP 从 rankorder 中看到相同的结果。 - Roman Cheplyaka
可能是Understanding the order() function的重复问题。 - user
7个回答

74
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排序后的索引。

x 的第27个值最小,因此order(x)的第一个元素是27,如果查看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

6
注意当存在并列情况时的区别。 - Greg Snow

13

后来证明这是一个特殊情况,使事情变得混乱。以下是我解释给任何感兴趣的人:

rank 返回升序列表中每个元素的顺序

order 返回升序列表中每个元素的索引


这非常容易理解,谢谢。其他的解释只会更加混淆。 - tushortz

8

我总是感到混淆,难以区分这两者之间的差异,我常常会想:“我如何使用rank来获取order?”

从Justin的例子开始:

使用Rank获取Order:

## 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

6

通俗易懂地讲,order 是指在对数值进行排序后,该数值的实际位置或顺序。

例如:

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

a中数字1的位置为第7位,2的位置为第3位。

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

2
但问题是关于rankorder之间的区别。 - Mr. T

6

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

1

如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);

此外,我发现order具有以下属性(尚未经过理论验证):
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.

0

一些观察:

set.seed(0)
x<-matrix(rnorm(10),1)
dm<-diag(length(x))

# compute  rank from order and backwards:
rank(x)  == col(x)%*%dm[order(x),]
order(x) == col(x)%*%dm[rank(x),]


# in special cases like this
x<-cumsum(rep(c(2,0),times=5))+rep(c(0,-1),times=5)
# they are equal
order(x)==rank(x)


diag(length(x))[order(x),]==t(diag(length(x))[rank(x),]) 是排名和顺序之间的关系。 - Nick Nassuphis
rank()是order()的逆置排列。有些排列是它们自己的逆置排列,在这些情况下,“order(x)==rank(x)”。一般来说,“all(x==x[order(x)][rank(x)])”总是成立的。 - Nick Nassuphis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接