如果我们有:
mat <- matrix(c(NA,1,2,3,NA,NA,4,5,NA,NA,NA,6,NA,NA,NA,NA), nrow=,4)
# [,1] [,2] [,3] [,4]
#[1,] NA NA NA NA
#[2,] 1 NA NA NA
#[3,] 2 4 NA NA
#[4,] 3 5 6 NA
我们想要
# [,1] [,2] [,3] [,4]
#[1,] NA 1 2 3
#[2,] 1 NA 4 5
#[3,] 2 4 NA 6
#[4,] 3 5 6 NA
我们该怎么做?
我试过了:
v <- mat
v[upper.tri(v)] <- t(v[lower.tri(v)])
# same as v[upper.tri(v)] <- (v[lower.tri(v)])
但是这显示了
v
# [,1] [,2] [,3] [,4]
#[1,] NA 1 2 4
#[2,] 1 NA 3 5
#[3,] 2 4 NA 6
#[4,] 3 5 6 NA
答案 0 :(得分:3)
您也可以使用as.dist
并将其打包在as.matrix
:
as.matrix(as.dist(mat))
# 1 2 3 4
# 1 0 1 2 3
# 2 1 0 4 5
# 3 2 4 0 6
# 4 3 5 6 0
或者,更具体地说(但有点隐蔽)......
`diag<-`(`dimnames<-`(as.matrix(as.dist(mat)), list(NULL, NULL)), NA)
# [,1] [,2] [,3] [,4]
# [1,] NA 1 2 3
# [2,] 1 NA 4 5
# [3,] 2 4 NA 6
# [4,] 3 5 6 NA
答案 1 :(得分:1)
得到它
v[upper.tri(v)] <- (t(v)[upper.tri(t(v))])
答案 2 :(得分:1)
矫枉过正,但您也可以使用forceSymmetric
library(Matrix)
as.matrix(forceSymmetric(mat, "L"))
# [,1] [,2] [,3] [,4]
# [1,] NA 1 2 3
# [2,] 1 NA 4 5
# [3,] 2 4 NA 6
# [4,] 3 5 6 NA
答案 3 :(得分:1)
只需在byrow = TRUE
mat
即可
mat <- matrix(c(NA,1,2,3,NA,NA,4,5,NA,NA,NA,6,NA,NA,NA,NA), nrow=,4)
matrix(mat, 4)
# [,1] [,2] [,3] [,4]
# [1,] NA NA NA NA
# [2,] 1 NA NA NA
# [3,] 2 4 NA NA
# [4,] 3 5 6 NA
(mat1 <- matrix(mat, 4, byrow = TRUE))
# [,1] [,2] [,3] [,4]
# [1,] NA 1 2 3
# [2,] NA NA 4 5
# [3,] NA NA NA 6
# [4,] NA NA NA NA
mat[upper.tri(mat)] <- mat1[upper.tri(mat1)]
# [,1] [,2] [,3] [,4]
# [1,] NA 1 2 3
# [2,] 1 NA 4 5
# [3,] 2 4 NA 6
# [4,] 3 5 6 NA