Из матрицы 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
Может кто-нибудь объяснить причину и преимущество такого поведения и / или как правильно это сказать?