在R中的矩阵中获取对角线上的元素

时间:2014-07-13 22:17:42

标签: r matrix

我试图用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填充。

非常感谢你的帮助。

2 个答案:

答案 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,也会选择对角线。