R Language
Ontbrekende waarden
Zoeken…
Invoering
Als we niet weten welke waarde een variabele aanneemt, zeggen we dat de waarde ontbreekt, aangegeven met NA
.
Opmerkingen
Ontbrekende waarden worden weergegeven met het symbool NA
(niet beschikbaar). Onmogelijke waarden (bijv. Als gevolg van sqrt(-1)
) worden voorgesteld door het symbool NaN
(geen getal).
Ontbrekende gegevens onderzoeken
anyNA
meldt of er ontbrekende waarden aanwezig zijn; terwijl is.na
waarden mist:
vec <- c(1, 2, 3, NA, 5)
anyNA(vec)
# [1] TRUE
is.na(vec)
# [1] FALSE FALSE FALSE TRUE FALSE
ìs.na
retourneert een logische vector die onder rekenkundige bewerkingen wordt gedwongen tot gehele getallen (met FALSE = 0, TRUE = 1). We kunnen dit gebruiken om erachter te komen hoeveel ontbrekende waarden er zijn:
sum(is.na(vec))
# [1] 1
In het is.na
van deze benadering kunnen we colSums
en is.na
op een gegevensframe gebruiken om NA's per kolom te tellen:
colSums(is.na(airquality))
# Ozone Solar.R Wind Temp Month Day
# 37 7 0 0 0 0
Het naniar-pakket (momenteel op github maar niet CRAN) biedt verdere hulpmiddelen voor het verkennen van ontbrekende waarden.
Gegevens lezen en schrijven met NA-waarden
Bij het lezen van gegevenssets in tabelvorm met de functies read.*
, Zoekt R automatisch naar ontbrekende waarden die op "NA"
lijken. Ontbrekende waarden worden echter niet altijd weergegeven door NA
. Soms geeft een punt ( .
), Een koppelteken ( -
) of een tekenwaarde (bijvoorbeeld: empty
) aan dat een waarde NA
. De parameter na.strings
van de functie read.*
Kan worden gebruikt om R te vertellen welke symbolen / tekens moeten worden behandeld als NA
waarden:
read.csv("name_of_csv_file.csv", na.strings = "-")
Het is ook mogelijk om aan te geven dat meer dan één symbool moet worden gelezen als NA
:
read.csv('missing.csv', na.strings = c('.','-'))
Evenzo kunnen NA
's worden geschreven met aangepaste tekenreeksen met het argument na
om write.csv
te write.csv
. Andere hulpmiddelen voor het lezen en schrijven van tabellen hebben vergelijkbare opties.
Gebruik NA's van verschillende klassen
Het symbool NA
staat voor een logical
ontbrekende waarde:
class(NA)
#[1] "logical"
Dit is handig, omdat het gemakkelijk kan worden gedwongen tot andere atomaire vectortypen en daarom meestal de enige NA
u nodig hebt:
x <- c(1, NA, 1)
class(x[2])
#[1] "numeric"
Als u een enkele NA
waarde van een ander type nodig hebt, gebruik dan NA_character_
, NA_integer_
, NA_real_
of NA_complex_
. Voor ontbrekende waarden van fancy klassen werkt subsetting met NA_integer_
meestal; om bijvoorbeeld een ontbrekende waarde Date te krijgen:
class(Sys.Date()[NA_integer_])
# [1] "Date"
WAAR / ONWAAR en / of NA
NA
is een logisch type en een logische operator met een NA
retourneert NA
als de uitkomst dubbelzinnig is. Hieronder wordt NA OR TRUE
geëvalueerd als TRUE
omdat ten minste één partij TRUE
, maar NA OR FALSE
geeft NA
terug omdat we niet weten of NA
TRUE
of FALSE
zou zijn geweest
NA | TRUE
# [1] TRUE
# TRUE | TRUE is TRUE and FALSE | TRUE is also TRUE.
NA | FALSE
# [1] NA
# TRUE | FALSE is TRUE but FALSE | FALSE is FALSE.
NA & TRUE
# [1] NA
# TRUE & TRUE is TRUE but FALSE & TRUE is FALSE.
NA & FALSE
# [1] FALSE
# TRUE & FALSE is FALSE and FALSE & FALSE is also FALSE.
Deze eigenschappen zijn handig als u een gegevensset wilt subsetten op basis van enkele kolommen die NA
bevatten.
df <- data.frame(v1=0:9,
v2=c(rep(1:2, each=4), NA, NA),
v3=c(NA, letters[2:10]))
df[df$v2 == 1 & !is.na(df$v2), ]
# v1 v2 v3
#1 0 1 <NA>
#2 1 1 b
#3 2 1 c
#4 3 1 d
df[df$v2 == 1, ]
v1 v2 v3
#1 0 1 <NA>
#2 1 1 b
#3 2 1 c
#4 3 1 d
#NA NA NA <NA>
#NA.1 NA NA <NA>
Ontbrekende waarden weglaten of vervangen
Ontbrekende waarden hercoderen
Regelmatig worden ontbrekende gegevens niet als NA
gecodeerd in gegevenssets. In SPSS worden ontbrekende waarden bijvoorbeeld vaak voorgesteld door de waarde 99
.
num.vec <- c(1, 2, 3, 99, 5)
num.vec
## [1] 1 2 3 99 5
Het is mogelijk om NA direct toe te wijzen met behulp van subsetting
num.vec[num.vec == 99] <- NA
De voorkeursmethode is echter het gebruik van is.na<-
zoals hieronder. Het helpbestand ( ?is.na
) vermeldt:
is.na<-
mogelijk een veiligere manier om vermissing in te stellen. Het gedraagt zich bijvoorbeeld anders voor factoren.
is.na(num.vec) <- num.vec == 99
Beide methoden komen terug
num.vec
## [1] 1 2 3 NA 5
Ontbrekende waarden verwijderen
Ontbrekende waarden kunnen op verschillende manieren uit een vector worden verwijderd:
num.vec[!is.na(num.vec)]
num.vec[complete.cases(num.vec)]
na.omit(num.vec)
## [1] 1 2 3 5
Ontbrekende waarden uitsluiten van berekeningen
Wanneer u rekenkundige functies gebruikt op vectoren met ontbrekende waarden, wordt een ontbrekende waarde geretourneerd:
mean(num.vec) # returns: [1] NA
De parameter na.rm
geeft de functie aan dat de NA
waarden van de berekening moeten worden uitgesloten:
mean(num.vec, na.rm = TRUE) # returns: [1] 2.75
# an alternative to using 'na.rm = TRUE':
mean(num.vec[!is.na(num.vec)]) # returns: [1] 2.75
Sommige R-functies, zoals lm
, hebben een parameter na.action
. De standaardwaarde hiervoor is na.omit
, maar met options(na.action = 'na.exclude')
het standaardgedrag van R worden gewijzigd.
Als het niet nodig is om het standaardgedrag te wijzigen, maar voor een specifieke situatie een andere na.action
nodig is, moet de parameter na.action
worden opgenomen in de functieaanroep, bijvoorbeeld:
lm(y2 ~ y1, data = anscombe, na.action = 'na.exclude')