我试图用R中的矩阵解决一个小问题。我在R中有下一个矩阵(alfa
):
alfa <- matrix(1:9,nrow=3)
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
alfa
的对角线填充零。我想在一个新的矩阵中得到这个相对对角线上的所有元素(也许是这个对角线上方的上三角形)。我希望得到一个像这样的新矩阵:
[,1] [,2] [,3]
[1,] 1 4 0
[2,] 2 0 0
[3,] 0 0 0
或者像NA
这样的矩阵:
[,1] [,2] [,3]
[1,] 1 4 0
[2,] 2 0 NA
[3,] 0 NA NA
如您所见,位于alfa
的对角线下方的元素为零或NA
。我尝试使用row(alfa)
和col(alfa)
代码,但我无法获得预期的矩阵,例如:
(row(alfa)+col(alfa)-1)%%ncol(alfa)!=0
我得到了这个结果,其中对角线上方的上下元素都是TRUE
:
[,1] [,2] [,3]
[1,] TRUE TRUE FALSE
[2,] TRUE FALSE TRUE
[3,] FALSE TRUE TRUE
但我只想要上面的元素,其余元素应该用零或NA
填充。
非常感谢你的帮助。
答案 0 :(得分:2)
f <- function(mat, diag = 0, offdiag = NA){
rev_vec <- seq(ncol(mat), 1)
j <- mat[,rev_vec]
j[lower.tri(j)] <- offdiag
diag(j) <- diag
j[,rev_vec]
}
您可以通过更改offdiag参数来指定是否希望非对角线为NA或0。
答案 1 :(得分:2)
lower.tri
几乎可以做你想要的,但你需要反转行。
alfa[apply(lower.tri(alfa), 1, rev)] <- NA
这里,构建了下反对角线的矩阵,并用于选择alfa
(向量索引)进行替换。
lower.tri
有一个diag
参数,如果设置为TRUE
,也会选择对角线。