У меня есть огромный вектор, который имеет пару значений NA
, и я пытаюсь найти максимальное значение в этом векторе (вектор - все числа), но я не могу сделать это из-за значений NA
.
Как я могу удалить значения NA
чтобы я мог вычислить максимум?
Попытка ?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
вызывает проблемы при вызове функции, стоит проверить встроенное решение среди аргументов функции. Я нашел там, как правило, уже там.
Функция na.omit
- это то, что многие из процедур регрессии используют внутри:
vec <- 1:1000
vec[runif(200, 1, 1000)] <- NA
max(vec)
#[1] NA
max( na.omit(vec) )
#[1] 1000
?max
показывает, что существует дополнительный параметр na.rm
, который можно установить на TRUE
.
Кроме того, если вы действительно хотите удалить NA
s, просто используйте что-то вроде:
myvec[!is.na(myvec)]
На всякий случай, кто-то новый для 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.
Вы можете позвонить max(vector, na.rm = TRUE)
. В более общем плане вы можете использовать функцию na.omit()
.
na.omit
также есть методna.omit
, поэтому он более общий.