我的问题非常类似于: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"
)))
答案 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