将三角分段矩阵转换为对角线R为0的对称矩阵



我的问题非常类似于:从文件中读取省略上三角部分的对称矩阵

主要的区别是我的成对矩阵缺少对角线,我希望它设置为0。

所以,如果我必须读一个矩阵,看起来像这样:

> x
   1    2     3     4     5    6
1 NA 0.043 0.080 0.106 0.032 0.058
2 NA    NA 0.078 0.112 0.035 0.071
3 NA    NA    NA 0.100 0.068 0.100
4 NA    NA    NA    NA 0.093 0.129
5 NA    NA    NA    NA    NA 0.059

如何将"对角线上的零"相加,然后将其转换为对称矩阵?

编辑:这就是所需输出的样子:

> y
    1        2         3        4      5       6
1   0.000   0.043   0.080   0.106   0.032   0.058
2   0.043   0.000   0.078   0.112   0.035   0.071
3   0.080   0.078   0.000   0.100   0.068   0.100
4   0.106   0.112   0.100   0.000   0.093   0.129
5   0.032   0.035   0.068   0.093   0.000   0.059
6   0.058   0.071   0.100   0.129   0.059   0.000

我相信这很简单,但我想不通。提前谢谢。

数据例如:

x<-structure(c(NA, NA, NA, NA, NA, 0.043, NA, NA, NA, NA, 0.08, 
0.078, NA, NA, NA, 0.106, 0.112, 0.1, NA, NA, 0.032, 0.035, 0.068, 
0.093, NA, 0.058, 0.071, 0.1, 0.129, 0.059), .Dim = 5:6, .Dimnames = list(
    c("1", "2", "3", "4", "5"), c("1", "2", "3", "4", "5", "6"
    )))

首先,您必须向矩阵中添加一行额外的NA(因为现在是5乘6):

x <- rbind(x, "6"=NA)

然后你可以将整个下半部分(包括对角线)变成0,然后将其添加到自己的转置中:

x[!upper.tri(x)] <- 0
result <- x + t(x)

(请注意,在您的情况下,x[is.na(x)] <- 0也可以)。

还有:

nm1 <- unique(unlist(dimnames(x)))
x1 <- matrix(NA, ncol=length(nm1), nrow=length(nm1), dimnames=list(nm1, nm1))
x1[match(rownames(x), nm1), match(colnames(x), nm1)] <- x
library(Matrix) 
x2 <- forceSymmetric(x1)
diag(x2) <- 0
 x2
 #6 x 6 Matrix of class "dsyMatrix"
 #     1     2     3     4     5     6
 #1 0.000 0.043 0.080 0.106 0.032 0.058
 #2 0.043 0.000 0.078 0.112 0.035 0.071
 #3 0.080 0.078 0.000 0.100 0.068 0.100
 #4 0.106 0.112 0.100 0.000 0.093 0.129
 #5 0.032 0.035 0.068 0.093 0.000 0.059
 #6 0.058 0.071 0.100 0.129 0.059 0.000

最新更新