Удалить значения NA из вектора

У меня есть огромный вектор, который имеет пару значений NA, и я пытаюсь найти максимальное значение в этом векторе (вектор - все числа), но я не могу сделать это из-за значений NA.

Как я могу удалить значения NA чтобы я мог вычислить максимум?

Ответ 1

Попытка ?max, вы увидите, что на самом деле есть аргумент na.rm =, по умолчанию установлен на FALSE. (Это общее значение по умолчанию для многих других R-функций, включая sum(), mean() и т.д.)

Настройка na.rm=TRUE выполняет только то, что вы просите:

d <- c(1, 100, NA, 10)
max(d, na.rm=TRUE)

Если вы хотите удалить все NA s, используйте эту идиому вместо этого:

d <- d[!is.na(d)]

Последнее примечание. Другие функции (например, table(), lm() и sort()) имеют NA -связанные аргументы, которые используют разные имена (и предлагают разные варианты). Поэтому, если NA вызывает проблемы при вызове функции, стоит проверить встроенное решение среди аргументов функции. Я нашел там, как правило, уже там.

Ответ 2

Функция na.omit - это то, что многие из процедур регрессии используют внутри:

vec <- 1:1000
vec[runif(200, 1, 1000)] <- NA
max(vec)
#[1] NA
max( na.omit(vec) )
#[1] 1000

Ответ 3

?max показывает, что существует дополнительный параметр na.rm, который можно установить на TRUE.

Кроме того, если вы действительно хотите удалить NA s, просто используйте что-то вроде:

myvec[!is.na(myvec)]

Ответ 4

Вы можете позвонить max(vector, na.rm = TRUE). В более общем плане вы можете использовать функцию na.omit().

Ответ 5

На всякий случай, кто-то новый для R хочет получить упрощенный ответ на исходный вопрос

Как удалить значения NA из вектора?

Вот он:

Предположим, что у вас есть вектор foo следующим образом:

foo = c(1:10, NA, 20:30)

running length(foo) дает 22.

nona_foo = foo[!is.na(foo)]

length(nona_foo) равно 21, потому что значения NA удалены.

Помните is.na(foo) возвращает булевскую матрицу, поэтому индексирование foo с противоположностью этого значения даст вам все элементы, которые не являются NA.

Ответ 6

Используйте discard из purrr (работает со списками и векторами).

discard(v, is.na) 

Преимущество заключается в простоте использования pipe; в качестве альтернативы используйте встроенную функцию поднабора [:

v %>% discard(is.na)
v %>% '['(!is.na(.))