从矩阵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 :(得分:1)
原因很简单:-x
中的减号没有被视为特殊的东西,它只是常规的数学运算。因此,-0
与0
相同,而-NA
与NA
相同。
@Cettt给出了一个答案:setdiff(seq_len(ncol(M)), x)
将给出x
以外的列号。您可以使用逻辑索引执行相同的操作,因为seq_len(ncol(M)) != x
是一个数字,但x
是x
时,NA
会起作用。如果您确实也需要处理这种情况,则可以使用is.na(x) | seq_len(ncol(M)) != x
,但@Cettt的解决方案看起来更简单。