【问题标题】:R: Copy matrix triangles, excluding NA valuesR:复制矩阵三角形,不包括 NA 值
【发布时间】:2020-10-01 17:51:58
【问题描述】:

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

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


【解决方案1】:

在 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)

【讨论】:

    【解决方案2】:

    您可以从dplyr 使用coalesce

    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])
    

    【讨论】:

    • 谢谢!它没有给出正确的输出矩阵,但是在基础 R 中使用 ifelse 语句是个好主意。我使用该函数弄清楚了,代码已发布!再次感谢!
    • 我认为这只是一个错字。将m1 替换为m。 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 2019-08-25
    • 2016-09-06
    • 2017-06-17
    • 1970-01-01
    • 2012-09-04
    相关资源
    最近更新 更多