R 中的排名和顺序

rank and order in R

提问人:Alex 提问时间:9/6/2012 最后编辑:zx8754Alex 更新时间:8/6/2021 访问量:110243

问:

我很难理解 R 函数和 R 函数之间的区别。它们似乎产生相同的输出:rankorder

> 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

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

排序 R-FAQ

评论

3赞 Patrick Burns 9/6/2012
关于这一点的博客文章是:portfolioprobe.com/2012/07/26/r-inferno-ism-order-is-not-rank
1赞 Roman Cheplyaka 3/19/2016
我还写了一篇关于这个的博客文章。特别是,我试图解释为什么 OP 从 和 看到相同的结果。rankorder
0赞 user 5/12/2017
了解 order() 函数的可能重复

答:

74赞 Justin 9/6/2012 #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返回一个向量,其中包含每个值的“秩”。第一位的数字是第 9 低的。 返回将初始向量排序的索引。orderx

的第 27 个值是最低的,- 的第一个元素也是最低的,如果你看一下,第 27 个元素是 。x27order(x)rank(x)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 9/6/2012
还要注意有领带时的差异。
13赞 Alex 9/6/2012 #2

事实证明,这是一个特例,让事情变得混乱。我在下面为任何感兴趣的人解释:

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

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

评论

0赞 tushortz 8/4/2020
这很容易理解,谢谢。所有其他解释都只是更多的混乱
8赞 geneorama 9/7/2012 #3

我总是觉得思考两者之间的区别很困惑,我总是在想,“我怎样才能使用”?orderrank

从 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
1赞 ewre 5/7/2013 #4

正如 R 提示符中的 ?order() 所述, 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赞 sau 4/16/2016 #5

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
6赞 user9476132 3/12/2018 #6

用通俗的话来说,给出对值进行排序后值的实际位置/位置 例如:order

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

in 的位置是 7。in 的类似位置是 3。1a2a

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

评论

2赞 Mr. T 3/12/2018
但问题是关于 和 之间的区别。rankorder
0赞 Nick Nassuphis 1/17/2020 #7

一些观察:

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)

评论

0赞 Nick Nassuphis 1/17/2020
diag(length(x))[order(x),]==t(diag(length(x))[rank(x),])是等级和顺序之间的关系
0赞 Nick Nassuphis 1/18/2020
rank() 是 order() 的逆排列。有些排列是它们自己的逆排列,正是在这些情况下。一般来说,总是成立的。order(x)==rank(x)all(x==x[order(x)][rank(x)])