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

时间:2019-03-16 09:22:41

标签: r matrix

从矩阵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])

对于这种情况,没有要删除的列,我尝试将NA0添加到条件向量,但无法正常工作。

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

有人可以解释这种行为的原因和优势,和/或怎么说正确吗?

1 个答案:

答案 0 :(得分:1)

原因很简单:-x中的减号没有被视为特殊的东西,它只是常规的数学运算。因此,-00相同,而-NANA相同。

@Cettt给出了一个答案:setdiff(seq_len(ncol(M)), x)将给出x以外的列号。您可以使用逻辑索引执行相同的操作,因为seq_len(ncol(M)) != x是一个数字,但xx时,NA会起作用。如果您确实也需要处理这种情况,则可以使用is.na(x) | seq_len(ncol(M)) != x,但@Cettt的解决方案看起来更简单。