为什么在R中,order(order(x))等于rank(x)?

3
在这篇文章中指出order(order(x))rank(X)相同。虽然一些实验证实了这一点...
#why is order(order(x)) == rank(x)?
x <- c(0.2, 0.5, 0.1)
x
## [1] 0.2 0.5 0.1
order(x)
## [1] 3 1 2
rank(x)
## [1] 2 3 1
order(order(x))
## [1] 2 3 1

我无法看到这个如何被证明,更好的方式是直觉上的理解。
相关链接:R中的排名和排序

2
使用 ties.method = "first" 时,rank 实际上使用的是 sort.list(sort.list(x)) - Roland
@RomanCheplyaka:这可能是一个适合你的问题? - vonjd
2个回答

1

首先看一下由1到10的排列形成的整数序列会发生什么:

>  set.seed(123); x <- sample(10)
> x
 [1]  3  8  4  7  6  1 10  9  2  5
> order(x)
 [1]  6  9  1  3 10  5  4  2  8  7
> order(order(x))
 [1]  3  8  4  7  6  1 10  9  2  5
> rank(x)
 [1]  3  8  4  7  6  1 10  9  2  5

在这种情况下,order操作是它自己的逆运算。由于order操作总是返回以1开始的序列,因此任何嵌套的奇数次应用order都会给出相同的向量。 order返回一个索引向量,可用于对原始向量进行排序。因此,最小项的位置位于第一个位置,第二个最小值的位置紧随其后,......,而最后一项则是最大项的位置。因此,当您再次对索引向量执行该操作时,第一项现在是最小索引的索引,依此类推......并且是向量的等级。

0

我认为直觉是这样的:排名只是“如果首先对所有项目进行排序,第一个、第二个、...最后一个位置上的项目将在哪个位置上”的快捷方式。

因为我们正在谈论向量的位置的位置,所以我们必须嵌套order函数。

就像上面的例子一样,从第一个位置的外部order函数开始,它告诉我们最小索引在哪里(= 2)。现在,最小索引恰好位于数字排序后的位置(这就是order函数的作用),因此在上面的示例中,因为第一个数字(= 0.2)是第二大的数字,所以它在第二个位置上。

因此,这只是一种花哨的说法,即如果您首先对向量进行排序,则第一个数字将位于第二个位置 - 这正是rank函数提供的内容。


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