假设一个矩阵:获取矩阵条目的排名?
> 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
假设一个矩阵:获取矩阵条目的排名?
> 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
到@ 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
的内容。
为什么不把向量转换回矩阵,与原矩阵的尺寸是多少?
> 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
@Gavin辛普森有一个非常漂亮和优雅的解决方案!但有一个警告,但:
矩阵的类型将保持不变或被加宽。主要是你不会注意到,但考虑以下因素:
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
可以省略。
+1非常好。你的回答让我尝试 - 似乎没有必要创建副本。 'a [] < - rank(a)'这个技巧。这个成语直接进入了我在R中有用的事情列表。 – Andrie
@Andrie我只是假设OP可能希望单独留下“a” - 你说得很对,如果'a'可以复制矩阵被扔掉。 –