Відповіді:
Намагаючись ?max
, ви побачите, що він фактично має na.rm =
аргумент, встановлений за замовчуванням на FALSE
. (Це загальне значення для багатьох інших функцій R, в тому числі sum()
, mean()
і т.д.)
Налаштування na.rm=TRUE
робить саме те, що ви просите:
d <- c(1, 100, NA, 10)
max(d, na.rm=TRUE)
Якщо ви хочете видалити всі NA
файли, замість цього скористайтеся цією ідіомою:
d <- d[!is.na(d)]
Підсумкове зауваження: інші функції (наприклад table()
, lm()
і sort()
) мають NA
-споріднені аргументи, які використовують різні імена (і пропонують різні варіанти). Тож якщо NA
ви викликаєте проблеми у виклику функції, варто перевірити наявність вбудованого рішення серед аргументів функції. Я знайшов, що там зазвичай вже є.
max()
поводиться основна функція R (як, наприклад, під час виконання max(c(NA, NA)
). Особисто я вважаю її поведінку розумною; Я очікую, що він був побудований таким чином, щоб ви отримали очікуваний результат, роблячи такі речі, якa <- c(NA, NA); b <- 1:4; max(c(max(a, na.rm = TRUE), max(b, na.rm = TRUE)))
NA
засобів управління в чудовий пакет NumPy Python .)
NA
s з вектора NA
s, ви очікуєте, що порожній вектор, а не -∞.
?max
показує, що є додатковий параметр, na.rm
який ви можете встановити TRUE
.
Крім цього, якщо ви дійсно хочете видалити NA
s, просто використовуйте щось на кшталт:
myvec[!is.na(myvec)]
na.omit
того, існує метод фрейму даних, тому він є загальнішим.
Можна зателефонувати max(vector, na.rm = TRUE)
. Більш загально, ви можете використовувати na.omit()
функцію.
Про всяк випадок, якщо хтось із новин R захоче спростити відповідь на початкове запитання
Як я можу видалити значення NA з вектора?
Ось:
Припустимо, у вас такий вектор foo
:
foo = c(1:10, NA, 20:30)
біг length(foo)
дає 22.
nona_foo = foo[!is.na(foo)]
length(nona_foo)
дорівнює 21, оскільки значення NA видалено.
Пам'ятайте, is.na(foo)
повертає булева матриця, тому індексація foo
з протилежним цим значенням дасть вам усі елементи, які не є NA.
Використання discard
від purrr (працює зі списками та векторами).
discard(v, is.na)
Перевага полягає в тому, що труби легко використовувати; альтернативно використовувати вбудовану функцію підмножини [
:
v %>% discard(is.na)
v %>% `[`(!is.na(.))
Зауважте, що na.omit
не працює у списках:
> x <- list(a=1, b=2, c=NA)
> na.omit(x)
$a
[1] 1
$b
[1] 2
$c
[1] NA
Я провів швидкий тест порівняння двох base
підходів, і виявилося, що x[!is.na(x)]
це швидше, ніж na.omit
. Користувач qwr
запропонував спробувати purrr::dicard
також - це виявилося значно повільніше (хоча я з радістю буду коментувати мою реалізацію та тест!)
microbenchmark::microbenchmark(
purrr::map(airquality,function(x) {x[!is.na(x)]}),
purrr::map(airquality,na.omit),
purrr::map(airquality, ~purrr::discard(.x, .p = is.na)),
times = 1e6)
Unit: microseconds
expr min lq mean median uq max neval cld
purrr::map(airquality, function(x) { x[!is.na(x)] }) 66.8 75.9 130.5643 86.2 131.80 541125.5 1e+06 a
purrr::map(airquality, na.omit) 95.7 107.4 185.5108 129.3 190.50 534795.5 1e+06 b
purrr::map(airquality, ~purrr::discard(.x, .p = is.na)) 3391.7 3648.6 5615.8965 4079.7 6486.45 1121975.4 1e+06 c
Для довідки, ось початковий тест x[!is.na(x)]
vs na.omit
:
microbenchmark::microbenchmark(
purrr::map(airquality,function(x) {x[!is.na(x)]}),
purrr::map(airquality,na.omit),
times = 1000000)
Unit: microseconds
expr min lq mean median uq max neval cld
map(airquality, function(x) { x[!is.na(x)] }) 53.0 56.6 86.48231 58.1 64.8 414195.2 1e+06 a
map(airquality, na.omit) 85.3 90.4 134.49964 92.5 104.9 348352.8 1e+06 b
purrr:discard
-Inf
дляd
всіх ВПЛ.