首页 > 解决方案 > 如何从矩阵中删除任何内容?

问题描述

从一个矩阵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

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

标签: rmatrix

解决方案


原因很简单:减号-x不被视为特殊的东西,它只是一个常规的数学运算。So-0与 相同0,并且-NA与 相同NA

@Cettt 给出了一个答案: setdiff(seq_len(ncol(M)), x)将给出除x. 您可以使用逻辑索引执行与seq_len(ncol(M)) != xif xis a number 相同的操作,但 if xis无效NA。如果您真的也需要处理这种情况,您可以使用is.na(x) | seq_len(ncol(M)) != x,但@Cettt 的解决方案看起来更简单。


推荐阅读