获取矩阵每一列的顺序(秩)的优雅方法

Elegant way to obtain order(rank) of each column of a matrix

我希望对矩阵的每一列的每个元素进行排序,就像对向量进行排序一样。例如,假设 A 是如下定义的矩阵。

(A = matrix(c(36, 37, 33, 38, 36, 32), nrow = 3, byrow = TRUE))

如何告诉 R 获取矩阵 A 中每一列的排名,如下所示?

      [,1] [,2]
[1,]   36   37
[2,]   33   38
[3,]   36   32

排名或顺序是

(rank_A = matrix(c(2.5, 2, 1, 3, 2.5, 1), nrow = 3, byrow = TRUE))

      [,1] [,2]
[1,]  2.5    2
[2,]  1.0    3
[3,]  2.5    1

我可以写成下面这样。

(rank_A <- matrix(rank(A[ ,1]), rank(A[ ,2]), nrow = 3, byrow = FALSE))

这会给我我想要的东西,但我想要一种优雅的方式。

也许你可以试试这个

> apply(A, 2, rank)
     [,1] [,2]
[1,]  2.5    2
[2,]  1.0    3
[3,]  2.5    1

我们可以使用 colRanks 来自 matrixStats

library(matrixStats)
t(colRanks(A, ties.method = 'average'))
     [,1] [,2]
[1,]  2.5    2
[2,]  1.0    3
[3,]  2.5    1

或使用dapplyfrank

library(collapse)
library(data.table)
dapply(A, MARGIN = 2, FUN = frank)
     [,1] [,2]
[1,]  2.5    2
[2,]  1.0    3
[3,]  2.5    1