2015-10-08 51 views
2

我有一个矩阵的下三角形,我试图转换为一个dissim矩阵,因此它需要是对称的。R:从较低的对角线制作对称矩阵

print(rdf) 

     X0  X1  X2  X3 X4 
0 0.0000000  NA  NA  NA NA 
1 0.5340909 0.0000000  NA  NA NA 
2 0.5340909 0.0000000 0.0000000  NA NA 
3 0.3200000 0.5227273 0.5227273 0.0000000 NA 
4 0.6263736 0.4945055 0.4945055 0.5384615 0 

library(gdata) 
upperTriangle(rdf) <- lowerTriangle(rdf) 
isSymmetric(rdf) 
     X0  X1  X2  X3  X4 
0 0.0000000 0.5340909 0.5340909 0.6263736 0.4945055 
1 0.5340909 0.0000000 0.3200000 0.0000000 0.5227273 
2 0.5340909 0.0000000 0.0000000 0.5227273 0.4945055 
3 0.3200000 0.5227273 0.5227273 0.0000000 0.5384615 
4 0.6263736 0.4945055 0.4945055 0.5384615 0.0000000 
[1] FALSE 

这是怎么回事?请注意,我并不需要使用GDATA

+0

似乎[this](http://stackoverflow.com/questions/18165320/creating-a-symmetric-matrix-in-r)或[this](http://stackoverflow.com/questions/29857378/make- a-matrix-symmetric?lq = 1)可能是重复的。 – aosmith

回答

5

你需要确保你复制的元件被正确地下令:

m <- matrix(NA,4,4) 
m[lower.tri(m,diag=TRUE)] <- 1:10 
    [,1] [,2] [,3] [,4] 
[1,] 1 NA NA NA 
[2,] 2 5 NA NA 
[3,] 3 6 8 NA 
[4,] 4 7 9 10 

makeSymm <- function(m) { 
    m[upper.tri(m)] <- t(m)[upper.tri(m)] 
    return(m) 
} 
makeSymm(m) 

或者你可以使用内置的

Matrix::forceSymmetric(m,uplo="L")