如何替换从左下角到右上角的对角线下方矩阵中的值?
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 函数 row
和 col
:
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
给定一个矩阵(未对其尺寸做出任何假设),它在从左下角到右上角的对角线下方包含零:
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 函数 row
和 col
:
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