代码之家  ›  专栏  ›  技术社区  ›  jay.sf

如何从矩阵中删除任何内容?

  •  0
  • jay.sf  · 技术社区  · 5 年前

    从矩阵 M ,

    > (M <- matrix(1:9, 3, 3))
         [,1] [,2] [,3]
    [1,]    1    4    7
    [2,]    2    5    8
    [3,]    3    6    9
    

    c(NA, 0) ,例如。

    cv1 <- 1:3
    lapply(cv1, function(x) M[, -x])
    

    对于这个案例,我试图添加的列没有要删除的列 NA 0 条件向量,但它不起作用。

    cv2 <- c(NA, 1:3)
    cv3 <- 0:3
    
    > lapply(cv2, function(x) M[, -x])[[1]]
    [1] NA NA NA
    
    > lapply(cv3, function(x) M[, -x])[[1]]
    
    [1,]
    [2,]
    [3,]
    

    lapply(cv2, function(x) {
      if (is.na(x))
        M
      else
        M[, -x]
    })
    

    但我想知道是否有更简单的方法。

    问题:

    首先让我印象深刻的是,在以下情况下,矩阵将消失,而不是保持完整,尽管我实际上试图什么都不删除:

    M[, -(na.omit(NA))]
    M[, na.omit(-(NA))]
    M[, -0]
    M[, -logical(0)]
    
    # [1,]
    # [2,]
    # [3,]
    

    > M[, -NULL]
    Error in -NULL : invalid argument to unary operator
    

    有人能解释一下这种行为的原因和优点吗,以及/或者如何正确地说出来?

    0 回复  |  直到 5 年前
        1
  •  1
  •   user2554330    5 年前

    原因很简单:输入减号 -x 这不是什么特别的东西,它只是一个常规的数学运算。所以 -0 0 -NA NA .

    setdiff(seq_len(ncol(M)), x) 将给出除 x . 您可以使用逻辑索引和 seq_len(ncol(M)) != x 如果 十、 是一个数字,但不是if 十、 . 如果你真的需要处理这个案子,你可以使用 is.na(x) | seq_len(ncol(M)) != x ,但@Cettt的解决方案看起来更简单。