Verwijder NA-waarden uit een vector

Ik heb een enorme vector die een paar NA-waarden heeft, en ik probeer de maximale waarde in die vector te vinden (de vector is allemaal getallen), maar ik kan het niet dit vanwege de NAwaarden.

Hoe kan ik de NAwaarden verwijderen zodat ik de max kan berekenen?


Antwoord 1, autoriteit 100%

Als je ?maxprobeert, zul je zien dat het een na.rm =-argument heeft, standaard ingesteld op FALSE. (Dat is de gebruikelijke standaard voor veel andere R-functies, waaronder sum(), mean(), enz.)

Het instellen van na.rm=TRUEdoet precies wat u vraagt:

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

Als je alle NA‘s wilt verwijderen, gebruik dan dit idioom:

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

Een laatste opmerking: andere functies (bijv. table(), lm()en sort()) hebben NA-gerelateerde argumenten die verschillende namen gebruiken (en verschillende opties bieden). Dus als NA‘s problemen veroorzaken bij het aanroepen van een functie, is het de moeite waard om te zoeken naar een ingebouwde oplossing tussen de argumenten van de functie. Ik heb ontdekt dat er meestalal een is.


Antwoord 2, autoriteit 35%

De functie na.omitis wat veel van de regressieroutines intern gebruiken:

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

Antwoord 3, autoriteit 9%

Gebruik discardvan purrr(werkt met lijsten en vectoren).

discard(v, is.na) 

Het voordeel is dat het gemakkelijk is om leidingen te gebruiken; of gebruik de ingebouwde subsetfunctie [:

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

Merk op dat na.omitniet werkt op lijsten:

> x <- list(a=1, b=2, c=NA)
> na.omit(x)
$a
[1] 1
$b
[1] 2
$c
[1] NA

Antwoord 4, autoriteit 8%

?maxlaat je zien dat er een extra parameter na.rmis die je kunt instellen op TRUE.

Afgezien daarvan, als je echtde NA‘s wilt verwijderen, gebruik dan zoiets als:

myvec[!is.na(myvec)]

Antwoord 5, autoriteit 6%

Je kunt max(vector, na.rm = TRUE)aanroepen. Meer in het algemeen kun je de functie na.omit()gebruiken.


Antwoord 6, autoriteit 6%

Voor het geval iemand die nieuw is bij R een vereenvoudigd antwoord op de oorspronkelijke vraag wil

Hoe kan ik NA-waarden van een vector verwijderen?

Hier is het:

Stel dat je een vector fooals volgt hebt:

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

het uitvoeren van length(foo)geeft 22.

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

length(nona_foo)is 21, omdat de NA-waarden zijn verwijderd.

Onthoud dat is.na(foo)een booleaanse matrix retourneert, dus het indexeren van foomet het tegenovergestelde van deze waarde geeft je alle elementen die niet NA zijn.


Antwoord 7, autoriteit 2%

Ik heb een snelle benchmark uitgevoerd om de twee base-benaderingen te vergelijken en het blijkt dat x[!is.na(x)]sneller is dan na.omit. Gebruiker qwrstelde voor om purrr::dicardook te proberen – dit bleek enorm langzamer te zijn (hoewel ik graag commentaar op mijn implementatie en test ontvang!)

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

Ter referentie, hier is de originele test van 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

Other episodes