【问题标题】:Get elements over opposite diagonal in a matrix in R在R中的矩阵中获取对角线上的元素
【发布时间】:2014-07-13 22:17:42
【问题描述】:

我正在尝试解决 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

非常感谢您的帮助。

【问题讨论】:

  • 虽然可重复的数据很受欢迎,但提供一个小矩阵会不会更简单,比如matrix(1:9,nrow=3)?功能应该是一样的吧?
  • 这行得通吗? m[(row(m) + col(m) - ncol(m) &gt; 0] &lt;- 0 其中 m 是您的矩阵。
  • 是的@thelatemail 对不起,我下次会接受你的推荐!!!
  • 哎呀,缺少)。应该是alfa[(row(alfa) + col(alfa) - ncol(alfa)) &gt; 0] &lt;- 0(将m 更改为alfa

标签: r matrix


【解决方案1】:

lower.tri 几乎可以满足您的需求,但您需要反转行。

alfa[apply(lower.tri(alfa), 1, rev)] <- NA

这里构建了下对角线的矩阵,用于选择入alfa(向量索引)进行替换。

lower.tri 有一个diag 参数,如果设置为TRUE,它也会选择对角线。

【讨论】:

    【解决方案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。

    【讨论】:

    • 谢谢@agstudy。我应该在干净的会话中检查该功能。
    猜你喜欢
    • 1970-01-01
    • 2018-10-20
    • 2016-06-02
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 2020-02-05
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多