【发布时间】:2017-05-04 00:31:54
【问题描述】:
在 R 中有没有一种方法可以使用具有多个条件和 ties.method 的 rank 函数(或类似函数)?
通常排名用于对向量中的值进行排名,如果存在平局,您可以使用其中一种平局方法(“平均”、“随机”、“第一”等)。但是在对矩阵中的列进行排名时,我想使用多列和其中一种关系方法。
一个最小的例子:
x <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
y <- c(1, 4, 5, 5, 2, 8 ,8, 1,3, 3)
z <- c(0.2, 0.8, 0.5, 0.4, 0.2, 0.1, 0.1, 0.7, 0.3, 0.3)
m <- cbind(x=x,y=y, z=z)
假设我想在上面的矩阵中对y-values 进行排名。但如果有关系,我希望函数查看z-values。如果在那之后仍然有联系,那么我想使用ties.method = "random"-参数。
换句话说,可能的结果是:
x y z
[1,] 1 1 0.2
[2,] 8 1 0.7
[3,] 5 2 0.2
[4,] 9 3 0.3
[5,] 10 3 0.3
[6,] 2 4 0.8
[7,] 4 5 0.4
[8,] 3 5 0.5
[9,] 6 8 0.1
[10,] 7 8 0.1
但也可能是这样的:
x y z
[1,] 1 1 0.2
[2,] 8 1 0.7
[3,] 5 2 0.2
[4,] 10 3 0.3
[5,] 9 3 0.3
[6,] 2 4 0.8
[7,] 4 5 0.4
[8,] 3 5 0.5
[9,] 7 8 0.1
[10,] 6 8 0.1
注意第四行和第五行的不同(就像第九行和第十行一样)。我已经能够使用order-function(即m[order(m[,2], m[,3], sample(length(x))),],但我想接收排名值,而不是排序矩阵的索引。
如果您需要详细说明我为什么需要排名值,请随时提问,我将编辑问题并提供更多详细信息。现在我认为最小的例子就可以了。
编辑:正如@alistaire 指出的那样,将数据框更改为矩阵。
【问题讨论】:
-
为了澄清,
cbind制作了一个矩阵,而不是一个 data.frame。如果你想要一个 data.frame,请使用data.frame。 -
@alistaire,你是对的,谢谢你的澄清!