#r #matrix
#r #матрица
Вопрос:
Из матрицы 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
or 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
Кто-нибудь может объяснить причину и преимущество такого поведения и / или как правильно это сформулировать?
Комментарии:
1. Может быть, вы можете использовать setdiff (1:3, x)
2. Вы могли бы удалить эти пустые значения перед передачей их в
lapply
саму матрицу.3. @Cettt Хороший подход, работает нормально, спасибо.
4. @RonakShah Суть в попытке удалить пустой набор, хотя.
Ответ №1:
Причина довольно проста: знак минус в -x
не рассматривается как нечто особенное, это просто обычная математическая операция. So -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
, но решение @Cetttt выглядит проще.