Видаліть значення НА з вектора


191

У мене величезний вектор, який має пару NAзначень, і я намагаюся знайти максимальне значення у цьому векторі (вектор - це всі числа), але я не можу цього зробити через NAзначення.

Як я можу видалити NAзначення, щоб я міг обчислити максимум?

Відповіді:


265

Намагаючись ?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ви викликаєте проблеми у виклику функції, варто перевірити наявність вбудованого рішення серед аргументів функції. Я знайшов, що там зазвичай вже є.


Це дуже погана ідея. Він терпить невдачу і дає -Infдля dвсіх ВПЛ.
користувач3932000

@ user3932000 Просто для того, щоб зрозуміти іншим, ваша скарга справді стосується того, як 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)))
Джош О'Брайен

@ user3932000 Дещо дотично, однією з багатьох сильних сторін R як платформи аналізу даних є її складне поводження з відсутніми даними, результат багато ретельного продумування з боку його авторів. (Якщо ви зацікавлені в цьому питанні, див. Тут, щоб добре обговорити деякі проблеми, з точки зору програмістів, які займалися включенням R-подібних NAзасобів управління в чудовий пакет NumPy Python .)
Джош O'Brien

@ user3932000: це відповідь насправді поганий? Що б ви вважали за максимум нульового набору?
Кліф АВ

@CliffAB Це не максимум. Ви можете призначити максимум до -∞ (а хв - + ∞), але це не завжди бажано або інтуїтивно. Крім того, коли ви видалите всі NAs з вектора NAs, ви очікуєте, що порожній вектор, а не -∞.
користувач3932000

94

na.omitФункція , що багато хто з регресійних процедур внутрішнього використання:

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

20

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

Крім цього, якщо ви дійсно хочете видалити NAs, просто використовуйте щось на кшталт:

myvec[!is.na(myvec)]

3
Я думаю, що це найкраще. na.rm і na.omit додають до виходу небагато сміття.
MadmanLee

Крім na.omitтого, існує метод фрейму даних, тому він є загальнішим.
IRTFM

15

Можна зателефонувати max(vector, na.rm = TRUE). Більш загально, ви можете використовувати na.omit()функцію.


14

Про всяк випадок, якщо хтось із новин 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.


13

Використання 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

1

Я провів швидкий тест порівняння двох 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
qwr
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.