获取矩阵每一列的顺序(秩)的优雅方法
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
或使用dapply
和frank
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
我希望对矩阵的每一列的每个元素进行排序,就像对向量进行排序一样。例如,假设 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
或使用dapply
和frank
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