【问题标题】:How to replace values in a matrix below the diagonal from bottom left to top right?如何替换从左下角到右上角的对角线下方矩阵中的值?
【发布时间】:2021-11-05 04:21:57
【问题描述】:

Given 是一个矩阵(没有对其维度进行假设),它在从左下角到右上角的对角线下方包含零:

m <- matrix(data = c(2, 1, 8, 9, 1,
                     5, 0, 4, 3, 6,
                     7, 1, 2, 5, 0,
                     3, 1, 0, 0, 0,
                     2, 8, 0, 0, 0,
                     9, 0, 0, 0, 0),
        nrow = 6,
        ncol = 5,
        byrow = TRUE)

问题是如何用NA 替换对角线下方的所有这些零?结果应该如下:

       [,1] [,2] [,3] [,4] [,5]
 [1,]    2    1    8    9    1
 [2,]    5    0    4    3    6
 [3,]    7    1    2    5   NA
 [4,]    3    1    0   NA   NA
 [5,]    2    8   NA   NA   NA
 [6,]    9   NA   NA   NA   NA

矩阵可能在其他地方(对角线上或对角线上方)包含零。这些零不应被替换。

【问题讨论】:

标签: r matrix replace diagonal


【解决方案1】:

使用base R 函数rowcol

m[row(m) + col(m) > nrow(m) + 1] <- NA

提供所需的输出:

> m
      [,1] [,2] [,3] [,4] [,5]
 [1,]    2    1    8    9    1
 [2,]    5    2    4    3    6
 [3,]    7    1    2    5   NA
 [4,]    3    1    3   NA   NA
 [5,]    2    8   NA   NA   NA
 [6,]    9   NA   NA   NA   NA

诀窍是添加每个单元格的行号和列号。所有数字大于行数加 1 的单元格都对应于从左下角到右上角的对角线下方的单元格。

【讨论】:

  • 为什么不只是m[row(m) + col(m) - nrow(m) &gt; 1] &lt;- NA
  • 感谢 GKi。我将根据您的建议简化我的答案。我从 lower.triupper.tri 函数中获得了太多灵感,我猜它们做了类似的事情。
【解决方案2】:

尝试upper.tri,如下所示

> replace(m, upper.tri(m)[nrow(m):1, ], NA)
     [,1] [,2] [,3] [,4] [,5]
[1,]    2    1    8    9    1
[2,]    5    0    4    3    6
[3,]    7    1    2    5   NA
[4,]    3    1    0   NA   NA
[5,]    2    8   NA   NA   NA
[6,]    9   NA   NA   NA   NA

【讨论】:

    【解决方案3】:

    ^NA 的选项

    m * NA^upper.tri(m)[rev(seq(nrow(m))),]
      [,1] [,2] [,3] [,4] [,5]
    [1,]    2    1    8    9    1
    [2,]    5    0    4    3    6
    [3,]    7    1    2    5   NA
    [4,]    3    1    0   NA   NA
    [5,]    2    8   NA   NA   NA
    [6,]    9   NA   NA   NA   NA
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      • 2014-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-17
      • 2021-12-21
      相关资源
      最近更新 更多