是否有一种简单的方法可以在多个标准上进行排名,从而保留R中的联系?

时间:2012-12-31 16:21:09

标签: r

如果单个标准排序良好,则排名函数返回显而易见的事情:

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

最后,问题是:是否有一种简单或内置的计算等级的方法,使用多个标准来保持联系?我已经编写了一个函数来完成它,但它很丑陋,对于这样一个基本功能看起来非常复杂......

1 个答案:

答案 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选项,则会节省一些内存。这将改变排名的数值,但不会更改它们的顺序,因此最终结果是相同的。