Как ничего не удалить из матрицы?

#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 выглядит проще.