【问题标题】:Elegant way to obtain order(rank) of each column of a matrix获取矩阵每一列的顺序(秩)的优雅方法
【发布时间】:2021-10-18 01:40:03
【问题描述】:

我希望矩阵的每一列的每个元素都像一个向量一样排列。例如,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))

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

【问题讨论】:

标签: r matrix apply rank


【解决方案1】:

也许你可以试试这个

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

【讨论】:

    【解决方案2】:

    我们可以使用matrixStats中的colRanks

    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
    

    【讨论】:

    • 您的解决方案很棒,就像另一个解决方案一样,只是我必须做出选择。
    • @DanielJames 如果您正在寻找优雅与效率,apply 更紧凑。关于效率,可能dapply会更快
    猜你喜欢
    • 2019-10-08
    • 2021-08-07
    • 2012-11-20
    • 2017-01-21
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    相关资源
    最近更新 更多