如何将矩阵中左下至右上对角线下方的指定0值替换为NA
问题描述
给定行数、列数无限制的矩阵,其从左下角延伸至右上角的对角线下方元素均为0,示例矩阵构造代码如下:
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)
需求是将该对角线下方的所有0替换为NA,对角线上方或对角线本身存在的0不需要替换,预期输出如下:
[,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内置的row()、col()函数即可快速定位需要替换的位置:
# 生成掩码:值为TRUE的位置对应对角线下方需要替换的区域 mask <- row(m) + col(m) > nrow(m) + 1 # 批量替换为NA m[mask] <- NA
逻辑说明
- 从左下角到右上角的对角线上,所有元素的行号与列号之和等于
nrow(m) + 1,以示例6行矩阵为例,对角线上的元素满足行号+列号=7 - 行号+列号大于该值的位置即为对角线下方的区域,仅对这些区域做替换操作,不会影响对角线及上方的元素,该区域内的0也会完整保留
内容的提问来源于stack exchange,提问作者PeterD
相关产品推荐
相关产品推荐

