【问题标题】:Deleting rows and columns in matrix based on values in diagonal in R根据R中对角线中的值删除矩阵中的行和列
【发布时间】:2013-07-17 15:20:02
【问题描述】:

使用 R:如果我有一个方阵,如果对角线上的值小于 5,那么删除行和列的最简单(也是最快)的方法是什么?例如

       x1  x2  x3  x4
    x1 13  15  12  25
    x2 23  4   23  34
    x3 21  11  1   11
    x4 11  22  23  33

代码将删除第 2 行和第 2 列,以及第 3 行和第 3 列。我尝试执行 for(i in 1:nrow(Mx)),但删除行会更改总行数。

最终的矩阵看起来像

       x1  x4
    x1 13  25
    x4 11  33

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    像这样使用diag 函数和与<[ 子集运算符的逻辑比较...

    idx <- ! diag(m) < 5
    m <- m[ idx , idx ]
    

    例如

    m
    #   x1 x2 x3 x4
    #x1 13 15 12 25
    #x2 23  4 23 34
    #x3 21 11  1 11
    #x4 11 22 23 33
    
    idx <- ! diag(m) < 5    
    m <- m[ idx , idx ]
    
    m
    #   x1 x4
    #x1 13 25
    #x4 11 33
    

    【讨论】:

    • 比我快 17 秒。但她也想选择列。
    • @Roland 哎呀。更新。 (虽然我可能不应该做两次比较!
    • 有没有办法在行名被删除时打印出来?
    • @Judy 在你删除之前你可以做which( diag(m) &lt; 5 )
    • @Judy 不直接。但是一旦你有了 idxrowNames(m)[which(!idx)] 应该返回删除行的名称。
    【解决方案2】:

    不是更优雅或最快的解决方案,但它有效

    mat <- matrix(c(13, 23, 21, 11, 15, 4, 11, 22, 12, 23,
                    1, 23, 25, 34, 11, 33), nrow = 4)
    
    ind <- which(diag(diag(mat)) > 5, arr.ind = TRUE)
    
    mat[ind[,1], ind[,2]]
    ##      [,1] [,2]
    ## [1,]   13   25
    ## [2,]   11   33
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-04
      • 1970-01-01
      • 1970-01-01
      • 2019-05-21
      • 2021-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多