Как ничего не удалить из матрицы? - PullRequest
1 голос
/ 16 марта 2019

Из матрицы 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

Может кто-нибудь объяснить причину и преимущество такого поведения и / или как правильно это сказать?

1 Ответ

1 голос
/ 16 марта 2019

Причина довольно проста: знак минуса в -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 выглядит проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...