大家好我试图解决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
非常感谢你的帮助。
答案 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]