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

use*_*887 20 r

当一个单一的标准排序很好时,秩函数会返回显而易见的东西:

rank(c(2,4,1,3,5))
[1] 2 4 1 3 5
Run Code Online (Sandbox Code Playgroud)

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

rank(c(2,4,1,1,5))
[1] 3.0 4.0 1.5 1.5 5.0
Run Code Online (Sandbox Code Playgroud)

排名功能不允许您对多个条件进行排序,因此您必须使用其他标准.一种方法是使用匹配和订单.对于没有关系的单个标准,结果是相同的:

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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

以这样的方式打破关系,使得绑定的元素保持其原始顺序而不是被分配相等的等级.显然,当您对多个条件进行排序时,此功能会进行概括:

match(1:5, order(c(2,4,1,4,5),c(10,11,12,11,13)))
[1] 2 3 1 4 5
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*erg 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
Run Code Online (Sandbox Code Playgroud)

这是正在发生的事情.

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
Run Code Online (Sandbox Code Playgroud)

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