R:复制矩阵对角线,不包括NA值

问题描述 投票:0回答:2

我有一个大型矩阵,结构如下:

m = structure(c(NA,9,NA,NA,NA,
                NA,NA,NA,NA,NA,
                10,7,NA,12,11,
                9,7,NA,NA,11,
                10,8,NA,NA,NA),
              .Dim = c(5L, 5L))

我只需要将值(不包括NA)从上对角线复制到下三角形,反之亦然,得到一个看起来像这样的矩阵:

m.result = structure(c(NA,9,10,9,10,
                9,NA,7,7,8,
                10,7,NA,12,11,
                9,7,12,NA,11,
                10,8,11,11,NA),
              .Dim = c(5L, 5L))

任何建议表示赞赏!

r matrix copy na diagonal
2个回答
0
投票

您可以使用coalesce中的dplyr

library(dplyr)
lt <- lower.tri(m1)
ut <- upper.tri(m1)

m[lt] <- coalesce(m[lt], m[ut])
m[ut] <- coalesce(m[ut], m[lt])

ifelse将其保留在基数R中:

m1[lt] <- ifelse(is.na(m1[lt]), m1[ut], m1[lt])
m1[ut] <- ifelse(is.na(m1[ut]), m1[lt], m1[ut])

0
投票

在Ronak的答案帮助下找到了答案:

m1 = structure(c(NA,9,NA,NA,NA,
                 NA,NA,NA,NA,NA,
                 10,7,NA,12,11,
                 9,7,NA,NA,11,
                 10,8,NA,NA,NA),
               .Dim = c(5L, 5L))

m1[lt] <- ifelse(is.na(lowerTriangle(m1, byrow=FALSE)), upperTriangle(m1, byrow=TRUE), lowerTriangle(m1, byrow=FALSE))
upperTriangle(m1) <- lowerTriangle(m1, byrow=TRUE)

m.result = structure(c(NA,9,10,9,10,
                       9,NA,7,7,8,
                       10,7,NA,12,11,
                       9,7,12,NA,11,
                       10,8,11,11,NA),
                     .Dim = c(5L, 5L))

identical(m1,m.result)
© www.soinside.com 2019 - 2024. All rights reserved.