反映lower.tri到upper.tri

时间:2014-11-25 15:48:32

标签: r matrix

如果我们有:

 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

4 个答案:

答案 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