将R中的一个新矩阵作为原矩阵的参考对角线

将R中的一个新矩阵作为原矩阵的参考对角线,r,R,大家好,我正在尝试解决一个小问题,在R中创建一个新的矩阵,使用原始矩阵的对角线作为参考。我的矩阵是alfet,它有下一种形式(我在最后一部分添加了dput()版本的alfet): 它有六行六列。我想创建一个新的矩阵,其中考虑到alfet的对角线元素,每列都设置在第一行。例如,对于第二列,对角线的值为0.15723270,然后该值进入同一列的第一行,位于同一列0.15723270之后的下一个元素也会发生同样的情况。我想得到这样的东西: A B C

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

它有六行六列。我想创建一个新的矩阵,其中考虑到
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中是否有任何函数来做这个或一些建议来构建这个新的矩阵。下一个版本是
alfet
dput()

structure(c(0.792375366568915, 0.39622641509434, 0.204081632653061, 
0.0357142857142857, 0, 0, 0.0187683284457478, 0.157232704402516, 
0.26530612244898, 0, 0, 0, 0.00557184750733138, 0.119496855345912, 
0.163265306122449, 0.0357142857142857, 0, 0, 0.000586510263929619, 
0.050314465408805, 0.102040816326531, 0.392857142857143, 0.111111111111111, 
0, 0.000293255131964809, 0.0314465408805031, 0.0204081632653061, 
0.0714285714285714, 0.333333333333333, 0, 0, 0.00628930817610063, 
0.0816326530612245, 0.214285714285714, 0.333333333333333, 0.901960784313726
), .Dim = c(6L, 6L), .Dimnames = structure(list(c("A", "B", "C", 
"D", "E", "F"), c("A", "B", "C", "D", "E", "F")), .Names = c("", 
"")))

非常感谢您的帮助。

您只需在元素向量上调用
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]      [,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
以下是一种方法:

# 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]

如果希望使用
NA
s而不是
0
s,可以使用
NA
s创建矩阵

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

矩阵的空元素应该是什么<代码>不适用
           [,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
mat <- matrix(NA, nrow = nrow(alfet), ncol = ncol(alfet))
mat[idx2] <- alfet[idx]