我很难理解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
有人能帮我解释一下吗?感谢
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
CCD_ 3返回一个向量;等级;每个值的。第一个位置的数字是倒数第9位。CCD_ 4返回将按顺序放置初始向量CCD_。
x
的第27个值是最低的,所以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
事实证明,这是一个特殊情况,会让事情变得混乱。我为任何感兴趣的人解释如下:
rank
返回递增列表中每个元素的顺序
order
返回每个元素在递增列表中的索引
我总是觉得很难理解两者之间的区别,我总是想,"如何使用rank
到达order
"?
从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
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
在外行的语言中,order
在对值进行排序后给出值的实际位置例如:
a<-c(3,4,2,7,8,5,1,6)
sort(a) [1] 1 2 3 4 5 6 7 8
CCD_ 17在CCD_。CCD_ 19在CCD_。
order(a) [1] 7 3 1 2 6 8 4 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.
一些观察结果:
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)