假设一个矩阵:
> a <- matrix(c(100, 90, 80, 20), 2, 2)
> a
[,1] [,2]
[1,] 100 80
[2,] 90 20
假设我想将矩阵的元素转换为rank:
>rank.a <- rank(a)
> rank.a
[1] 4 3 2 1
这返回一个向量,即矩阵结构丢失。是否可以对矩阵进行排序,使得输出的格式为:
[,1] [,2]
[1,] 4 2
[2,] 3 1
答案 0 :(得分: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
等级的向量。 / p>
答案 1 :(得分: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
答案 2 :(得分: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
。