考虑作为原始矩阵的参考对角线,在R中创建一个新矩阵

时间:2014-01-13 21:57:09

标签: r

大家好我试图解决R中的一个小问题,使用原始矩阵的对角线作为参考创建一个新矩阵。我的矩阵是alfet,它有下一个表单(我在最后部分添加了dput() alfet版本):

         A          B           C            D            E           F
  A 0.79237537 0.01876833 0.005571848 0.0005865103 0.0002932551 0.000000000
  B 0.39622642 0.15723270 0.119496855 0.0503144654 0.0314465409 0.006289308
  C 0.20408163 0.26530612 0.163265306 0.1020408163 0.0204081633 0.081632653
  D 0.03571429 0.00000000 0.035714286 0.3928571429 0.0714285714 0.214285714
  E 0.00000000 0.00000000 0.000000000 0.1111111111 0.3333333333 0.333333333
  F 0.00000000 0.00000000 0.000000000 0.0000000000 0.0000000000 0.901960784

它有六行六列。我想创建一个新的矩阵,其中考虑alfet的对角元素,每列设置在第一行。例如,对于第二列,对角线的值为0.15723270,则此值将转到同一列中的第一行,并且对于位于同一列中0.15723270之后的下一个元素,会发生相同的事情。我想得到这样的东西:

       A          B           C            D            E              F
A  0.79237537  0.1572327  0.163265306  0.3928571429  0.3333333333  0.901960784
B  0.39622642  0.2653061  0.035714286  0.1111111111  0
C  0.20408163  0          0            0
D  0.03571429  0          0
E  0           0            
F  0

我不知道在R中是否有任何函数来构建这个或建立这个新矩阵的建议。 dput()的{​​{1}}版本是下一个:

alfet

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:0)

您只需在元素向量上调用diag即可创建具有该对角线的空矩阵。因此,如果您将alfet的对角线传递给diag,您可以创建一个新矩阵,如下所示:

> new <- diag(diag(alfet))
> new
          [,1]      [,2]      [,3]      [,4]      [,5]      [,6]
[1,] 0.7923754 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
[2,] 0.0000000 0.1572327 0.0000000 0.0000000 0.0000000 0.0000000
[3,] 0.0000000 0.0000000 0.1632653 0.0000000 0.0000000 0.0000000
[4,] 0.0000000 0.0000000 0.0000000 0.3928571 0.0000000 0.0000000
[5,] 0.0000000 0.0000000 0.0000000 0.0000000 0.3333333 0.0000000
[6,] 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.9019608

答案 1 :(得分:0)

这是一种方法:

# create an index for lower triangular (including diagonal)
idx <- lower.tri(alfet, diag = TRUE)
# create an index for replacement
idx2 <- apply(idx, 2, rev)

# create a matrix with zeroes
mat <- matrix(0, nrow = nrow(alfet), ncol = ncol(alfet))

# replace values 
mat[idx2] <- alfet[idx]

结果(mat):

           [,1]      [,2]       [,3]      [,4]      [,5]      [,6]
[1,] 0.79237537 0.1572327 0.16326531 0.3928571 0.3333333 0.9019608
[2,] 0.39622642 0.2653061 0.03571429 0.1111111 0.0000000 0.0000000
[3,] 0.20408163 0.0000000 0.00000000 0.0000000 0.0000000 0.0000000
[4,] 0.03571429 0.0000000 0.00000000 0.0000000 0.0000000 0.0000000
[5,] 0.00000000 0.0000000 0.00000000 0.0000000 0.0000000 0.0000000
[6,] 0.00000000 0.0000000 0.00000000 0.0000000 0.0000000 0.0000000

如果您想要NA而不是0,则可以创建一个包含NA的矩阵。

mat <- matrix(NA, nrow = nrow(alfet), ncol = ncol(alfet))
mat[idx2] <- alfet[idx]