21

当单个标准排序良好时,rank 函数会返回显而易见的结果:

rank(c(2,4,1,3,5))
[1] 2 4 1 3 5

当单个标准具有平局时,排名函数(默认情况下)将平均排名分配给平局:

rank(c(2,4,1,1,5))
[1] 3.0 4.0 1.5 1.5 5.0

rank 函数不允许您根据多个标准进行排序,因此您必须使用其他内容。一种方法是使用匹配和顺序。对于没有关系的单个标准,结果是相同的:

rank(c(2,4,1,3,5))
[1] 2 4 1 3 5

match(1:5, order(c(2,4,1,3,5)))
[1] 2 4 1 3 5

但是,对于具有联系的单个标准,结果会有所不同:

rank(c(2,4,1,4,5))
[1] 2.0 3.5 1.0 3.5 5.0

match(1:5, order(c(2,4,1,4,5)))
[1] 2 3 1 4 5

联系被打破的方式是,被联系的元素保留其原始顺序,而不是被分配相同的等级。显然,当您根据多个标准进行排序时,此功能可以概括:

match(1:5, order(c(2,4,1,4,5),c(10,11,12,11,13)))
[1] 2 3 1 4 5

最后,问题是:是否有一种简单的或内置的方法来计算排名,使用多个标准来保持平局?我已经编写了一个函数来做到这一点,但是对于这样一个基本功能来说,它很丑而且看起来非常复杂......

4

1 回答 1

23

interaction做你需要的:

> rank(interaction(c(2,4,1,4,5),c(10,11,12,11,13), lex.order=TRUE))
[1] 2.0 3.5 1.0 3.5 5.0

这是正在发生的事情。

interaction期望因子,因此向量是强制的。这样做会在因子水平中产生由 指示的顺序sort.list,这对于numeric数字而言是非递减顺序。
然后将这两个因素结合起来,交互作用通过最快地改变第二个参数来创建因子水平(因为lex.order=TRUE)。因此,第一个向量中的关系由第二个向量中的值解决(如果可能的话)。
最后,rank将结果因子强制为numeric.

实际排名:

> as.numeric(interaction(c(2,4,1,4,5),c(10,11,12,11,13), lex.order=TRUE))
[1]  5 10  3 10 16

如果您提供选项,您将节省一些drop=TRUE内存interaction。这将改变排名数值,但不会改变它们的顺序,因此最终结果是相同的。

于 2012-12-31T16:50:02.990 回答