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 NA
waarden.
Hoe kan ik de NA
waarden verwijderen zodat ik de max kan berekenen?
Antwoord 1, autoriteit 100%
Als je ?max
probeert, 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=TRUE
doet 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.omit
is 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 discard
van 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.omit
niet 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%
?max
laat je zien dat er een extra parameter na.rm
is 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 foo
als 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 foo
met 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 qwr
stelde voor om purrr::dicard
ook 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