【问题标题】:How to delete specific rows and columns from a matrix in a smarter way?如何以更智能的方式从矩阵中删除特定的行和列?
【发布时间】:2012-10-06 20:45:26
【问题描述】:

假设t1 是:

t1 <- array(1:20, dim=c(10,10))

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    1   11    1   11    1   11    1   11    1    11
 [2,]    2   12    2   12    2   12    2   12    2    12
 [3,]    3   13    3   13    3   13    3   13    3    13
 [4,]    4   14    4   14    4   14    4   14    4    14
 [5,]    5   15    5   15    5   15    5   15    5    15
 [6,]    6   16    6   16    6   16    6   16    6    16
 [7,]    7   17    7   17    7   17    7   17    7    17
 [8,]    8   18    8   18    8   18    8   18    8    18
 [9,]    9   19    9   19    9   19    9   19    9    19
[10,]   10   20   10   20   10   20   10   20   10    20

我想从这个矩阵中删除第 4-6 行和第 7-9 列。

我知道如何使用

将其一一删除
t2 <- t1[,-7]
t3 <- t2[,-8]
t4 <- t3[,-9]
t5 <- t4[-4,]
t6 <- t5[-5,]
t7 <- t6[-6,]

但是,我认为这是最愚蠢的做法。你能建议一些更聪明的方法吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    你可以这样做:

    t1<- t1[-4:-6,-7:-9]
    

    【讨论】:

    • @tcash21 以及如何按名称删除行或列,但在矩阵中?
    • 我打算删除矩阵的“第 i 个”列:如何修复错误“t1[,-i] 中的错误:维数不正确调用”由代码 t1 &lt;- t1[,-i] 在 for 循环中抛出(其中 i 是迭代器)?
    【解决方案2】:

    你可以使用

    t1<- t1[-4:-6,-7:-9]  
    

    t1 <- t1[-(4:6), -(7:9)]
    

    t1 <- t1[-c(4, 5, 6), -c(7, 8, 9)]
    

    您可以通过vectors选择要删除的rows/columns。如果您尝试删除 连续 行/列,前两种方法很有用。如果您尝试删除 discrete rows/columns,则第三种方法很有用。

    > t1 <- array(1:20, dim=c(10,10));
    
    > t1[-c(1, 4, 6, 7, 9), -c(2, 3, 8, 9)]
    
         [,1] [,2] [,3] [,4] [,5] [,6]
    [1,]    2   12    2   12    2   12
    [2,]    3   13    3   13    3   13
    [3,]    5   15    5   15    5   15
    [4,]    8   18    8   18    8   18
    [5,]   10   20   10   20   10   20
    

    【讨论】:

      【解决方案3】:

      您还可以通过将逻辑布尔值向量输入矩阵来删除行和列。这可以处理您有多个非连续行非连续列需要删除的情况。

      # TRUE = Keep a row/column
      # FALSE = Delete a row/column
      #
      # FALSE for rows 4, 5, and 6
      # Row:            1     2     3     4      5      6      7     8     9     10
      rows_to_keep <- c(TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE)
          
      # FALSE for columns 7, 8, and 9
      # Column:         1     2     3     4     5     6     7      8      9      10
      cols_to_keep <- c(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE) 
      

      仅删除行:

      t1 <- t1[rows_to_keep,]
      

      仅删除列:

      t1 <- t1[,cols_to_keep]
      

      删除行和列:

      t1 <- t1[rows_to_keep, cols_to_keep]
      

      如果您事先不知道需要删除哪些行或列,则此编码技术很有用。 rows_to_keepcols_to_keep 向量可以由您的代码酌情计算。

      【讨论】:

        【解决方案4】:
        > S = matrix(c(1,2,3,4,5,2,1,2,3,4,3,2,1,2,3,4,3,2,1,2,5,4,3,2,1),ncol = 5,byrow = TRUE);S
        [,1] [,2] [,3] [,4] [,5]
        [1,]    1    2    3    4    5
        [2,]    2    1    2    3    4
        [3,]    3    2    1    2    3
        [4,]    4    3    2    1    2
        [5,]    5    4    3    2    1
        > S<-S[,-2]
        > S
        [,1] [,2] [,3] [,4]
        [1,]    1    3    4    5
        [2,]    2    2    3    4
        [3,]    3    1    2    3
        [4,]    4    2    1    2
        [5,]    5    3    2    1
        

        只需使用命令S &lt;- S[,-2] 删除第二列。类似地删除一行,例如删除第二行使用S &lt;- S[-2,]

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-07-08
          • 2021-05-17
          • 2021-08-23
          • 1970-01-01
          • 1970-01-01
          • 2017-04-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多