R: Rank-function with two variables and ties.method 随机

标签 r ranking rank

在 R 中有没有一种方法可以使用具有多个条件和 ties.method 的排名函数(或类似的东西)?

通常排名用于对向量中的值进行排名,如果有联系,您可以使用联系方法之一(“平均”、“随机”、“第一”、...)。但是当对矩阵中的列进行排名时,我想使用多列其中一种连接方法。

一个最小的例子:

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 值进行排序。但如果有关系,我希望函数查看 z 值。如果在那之后仍然有关系,那么我想使用 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 函数获得上述结果(即 m[order(m[,2], m[,3], sample(length(x)) ),],但我想接收排名值,而不是排序矩阵的索引。

如果您需要详细说明为什么我需要排名值,请随时提问,我将使用更多详细信息编辑问题。现在我认为最小的例子就可以了。

编辑:如@alistaire 指出的那样,将数据框更改为矩阵。

最佳答案

由于 order(order(x)) 给出的结果与 rank(x) 相同(参见 Why does order(order(x)) equal rank(x) in R? ),您可以这样做

order(order(y, z, runif(length(y))))

获取排名值。


这里有一个更复杂的方法,允许您使用 ties.method 中的方法。它需要 dplyr:

library(dplyr)
rank2 <- function(df, key1, key2, ties.method) {
  average <- function(x) mean(x)
  random <- function(x) sample(x, length(x))
  df$r <- order(order(df[[key1]], df[[key2]]))
  group_by_(df, key1, key2) %>% mutate(rr = get(ties.method)(r))  
}

rank2(df, "y", "z", "average")
# Source: local data frame [10 x 5]
# Groups: y, z [8]
#        x     y     z     r    rr
#    <dbl> <dbl> <dbl> <int> <dbl>
# 1      1     1   0.2     1   1.0
# 2      2     4   0.8     6   6.0
# 3      3     5   0.5     8   8.0
# 4      4     5   0.4     7   7.0
# 5      5     2   0.2     3   3.0
# 6      6     8   0.1     9   9.5
# 7      7     8   0.1    10   9.5
# 8      8     1   0.7     2   2.0
# 9      9     3   0.3     4   4.5
# 10    10     3   0.3     5   4.5

关于R: Rank-function with two variables and ties.method 随机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41214413/

相关文章:

algorithm - 归一化编辑距离

SQL全文搜索结果优先级

opencv - 如何在OpenCV中计算矩阵等级?

r - 在 R 代码中为路段(纬度经度)分配 ID

r - 只读取选定的列

r - nls 中的错误 - 迭代次数超过最大值

sql - 如何使用 RANK 对匹配记录进行分组

xml - 如何使用 R 将 data.frame 转换为 xml 文件?

mysql - MySQL 中的排名函数

fortran - 不同等级的重载fortran接口(interface)