3

假设一个矩阵:

> a <- matrix(c(100, 90, 80, 20), 2, 2)
> a
     [,1] [,2]
[1,]  100   80
[2,]   90   20

假设我想将矩阵的元素转换为等级:

>rank.a <- rank(a)
> rank.a
[1] 4 3 2 1

这将返回一个向量,即矩阵结构丢失。是否可以对矩阵进行排序,以使输出具有以下形式:

     [,1] [,2]
[1,]   4    2 
[2,]   3    1
4

3 回答 3

6

@EDi 的答案的替代方法是复制a然后将输出rank(a)直接分配到复制的元素中a

> a <- matrix(c(100, 90, 80, 20), 2, 2)
> rank.a <- a
> rank.a[] <- rank(a)
> rank.a
     [,1] [,2]
[1,]    4    2
[2,]    3    1

这样可以避免通过询问输入矩阵的维度来重建矩阵。

请注意(正如@Andrie 在评论中提到的那样)a只有在想要保留原件时才需要复制a。需要注意的主要一点是,由于a已经具有适当的维度,我们可以将其视为一个向量,并将 的内容替换为a的秩向量a

于 2011-09-30T13:18:43.553 回答
3

为什么不将向量转换回具有原始矩阵维度的矩阵?

> a <- matrix(c(100, 90, 80, 20, 10, 5), 2, 3)
> a
     [,1] [,2] [,3]
[1,]  100   80   10
[2,]   90   20    5
> rank(a)
[1] 6 5 4 3 2 1
> rmat <- matrix(rank(a), nrow = dim(a)[1], ncol = dim(a)[2])
> rmat
     [,1] [,2] [,3]
[1,]    6    4    2
[2,]    5    3    1
于 2011-09-30T12:51:58.683 回答
3

@Gavin Simpson 有一个非常好的和优雅的解决方案!但是有一个警告:

矩阵的类型将保持不变或扩大。大多数情况下您不会注意到,但请考虑以下几点:

a <- matrix( sample(letters, 4), 2, 2)
rank.a <- a
rank.a[] <- rank(a)
typeof(rank.a) # character

由于矩阵一开始是字符,所以rank值(是双精度值)被强制转换为字符串!

这是一种更安全的方法,可以简单地复制所有属性:

a <- matrix( sample(letters, 4), 2, 2)
rank.a <- rank(a)
attributes(rank.a) <- attributes(a)
typeof(rank.a) # double

或者,作为一个单行符,structure用于仅复制相关属性(但更多类型):

a <- matrix( sample(letters, 4), 2, 2)
rank.a <- structure(rank(a), dim=dim(a), dimnames=dimnames(a))

当然,dimnames在这种特殊情况下可以省略。

于 2011-09-30T15:31:28.140 回答