将三角形parwise矩阵转换为具有0对角线R的对称矩阵

时间:2014-09-18 11:09:24

标签: r matrix

我的问题非常类似于:Reading a symmetric matrix from file that omits upper triangular part

主要区别在于我的成对矩阵缺少对角线,我希望它设置为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"
    )))

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

答案 1 :(得分: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