如果单个标准排序良好,则排名函数返回显而易见的事情:
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(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
最后,问题是:是否有一种简单或内置的计算等级的方法,使用多个标准来保持联系?我已经编写了一个函数来完成它,但它很丑陋,对于这样一个基本功能看起来非常复杂......
答案 0 :(得分: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
选项,则会节省一些内存。这将改变排名的数值,但不会更改它们的顺序,因此最终结果是相同的。