【发布时间】:2019-03-16 09:22:40
【问题描述】:
来自矩阵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
有人可以解释这种行为的原因和优势,和/或如何正确表达吗?
【问题讨论】:
-
也许你可以使用 setdiff(1:3, x)
-
您可以在将这些空值传递给
lapply之前删除它们。 -
@Cettt 不错的方法,效果很好,谢谢。
-
@RonakShah 重点是尝试删除一个空集。