如何替换从左下角到右上角的对角线下方矩阵中的值?

How to replace values in a matrix below the diagonal from bottom left to top right?

给定一个矩阵(未对其尺寸做出任何假设),它在从左下角到右上角的对角线下方包含零:

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

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

使用 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 的单元格都对应于从左下角到右上角 运行 对角线下方的单元格。

像下面那样尝试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

带有 ^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