R Language
Fehlende Werte
Suche…
Einführung
Wenn wir nicht wissen, welchen Wert eine Variable annimmt, sagen wir, dass ihr Wert fehlt, angegeben durch NA
.
Bemerkungen
Fehlende Werte werden durch das Symbol NA
(nicht verfügbar) dargestellt. Unmögliche Werte (z. B. durch sqrt(-1)
) werden durch das Symbol NaN
(keine Zahl) dargestellt.
Untersuchen der fehlenden Daten
anyNA
meldet, ob fehlende Werte vorhanden sind. is.na
meldet fehlende Werte elementweise:
vec <- c(1, 2, 3, NA, 5)
anyNA(vec)
# [1] TRUE
is.na(vec)
# [1] FALSE FALSE FALSE TRUE FALSE
ìs.na
gibt einen logischen Vektor zurück, der bei arithmetischen Operationen zu ganzzahligen Werten gezwungen wird (mit FALSE = 0, TRUE = 1). Wir können dies verwenden, um herauszufinden, wie viele Werte fehlen:
sum(is.na(vec))
# [1] 1
In Erweiterung dieses Ansatzes können wir colSums
und is.na
in einem is.na
verwenden, um NAs pro Spalte zu zählen:
colSums(is.na(airquality))
# Ozone Solar.R Wind Temp Month Day
# 37 7 0 0 0 0
Das Naniar-Paket (derzeit auf Github, aber nicht auf CRAN) bietet weitere Tools zum Ermitteln fehlender Werte.
Lesen und Schreiben von Daten mit NA-Werten
Beim Lesen von Tabellendatensätzen mit der Funktion read.*
Sucht R automatisch nach fehlenden Werten, die wie "NA"
aussehen. Fehlende Werte werden jedoch nicht immer von NA
. Manchmal gibt ein Punkt ( .
), Ein Bindestrich ( -
) oder ein Zeichenwert (zB: empty
) an, dass ein Wert NA
. Mit na.strings
Parameter na.strings
der Funktion read.*
Kann R na.strings
werden, welche Symbole / Zeichen als NA
Werte behandelt werden müssen:
read.csv("name_of_csv_file.csv", na.strings = "-")
Es kann auch angegeben werden, dass mehr als ein Symbol als NA
gelesen werden muss:
read.csv('missing.csv', na.strings = c('.','-'))
In ähnlicher Weise NA
kann s mit maßgeschneiderten Strings geschrieben werden , um die Verwendung von na
Argument write.csv
. Andere Tools zum Lesen und Schreiben von Tabellen haben ähnliche Optionen.
Verwendung von NAs verschiedener Klassen
Das Symbol NA
steht für einen logical
fehlenden Wert:
class(NA)
#[1] "logical"
Dies ist praktisch, da es leicht zu anderen Atomvektortypen gezwungen werden kann und daher normalerweise die einzige NA
Sie benötigen:
x <- c(1, NA, 1)
class(x[2])
#[1] "numeric"
Wenn Sie einen einzelnen NA
Wert eines anderen Typs benötigen, verwenden Sie NA_character_
, NA_integer_
, NA_real_
oder NA_complex_
. Bei fehlenden Werten von ausgefallenen Klassen funktioniert das Subsetting mit NA_integer_
normalerweise. Zum Beispiel, um ein fehlendes Datum zu erhalten:
class(Sys.Date()[NA_integer_])
# [1] "Date"
TRUE / FALSE und / oder NA
NA
ist ein logischer Typ und ein logischer Operator mit einer NA
gibt NA
wenn das Ergebnis mehrdeutig ist. Unten NA OR TRUE
ausgewertet TRUE
, da mindestens eine Seite wertet TRUE
jedoch NA OR FALSE
kehrt NA
, weil wir nicht wissen , ob NA
gewesen wäre TRUE
oder FALSE
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.
Diese Eigenschaften sind hilfreich, wenn Sie einen Datensatz basierend auf einigen Spalten, die NA
enthalten, als Teilmenge festlegen möchten.
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>
Fehlende Werte auslassen oder ersetzen
Fehlende Werte neu codieren
Fehlende Daten werden in Datensätzen regelmäßig nicht als NA
codiert. In SPSS zum Beispiel werden fehlende Werte häufig durch den Wert 99
.
num.vec <- c(1, 2, 3, 99, 5)
num.vec
## [1] 1 2 3 99 5
Es ist möglich, die NA direkt über das Subset zuzuweisen
num.vec[num.vec == 99] <- NA
Die bevorzugte Methode ist jedoch die Verwendung von is.na<-
wie unten beschrieben. Die Hilfedatei ( ?is.na
) besagt:
is.na<-
kann einen sichereren Weg bieten, um den Mangel zu beheben. Es verhält sich beispielsweise für Faktoren anders.
is.na(num.vec) <- num.vec == 99
Beide Methoden kehren zurück
num.vec
## [1] 1 2 3 NA 5
Fehlende Werte entfernen
Fehlende Werte können auf verschiedene Weise aus einem Vektor entfernt werden:
num.vec[!is.na(num.vec)]
num.vec[complete.cases(num.vec)]
na.omit(num.vec)
## [1] 1 2 3 5
Fehlende Werte aus den Berechnungen ausschließen
Wenn arithmetische Funktionen für Vektoren mit fehlenden Werten verwendet werden, wird ein fehlender Wert zurückgegeben:
mean(num.vec) # returns: [1] NA
Der Parameter na.rm
teilt der Funktion mit, die NA
Werte von der Berechnung auszuschließen:
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
Einige R-Funktionen, wie na.action
. B. lm
, haben einen na.action
Parameter. Der Standardwert hierfür ist na.omit
, aber mit options(na.action = 'na.exclude')
das Standardverhalten von R geändert werden.
Wenn das Standardverhalten nicht geändert werden muss, aber für eine bestimmte Situation eine andere na.action
erforderlich ist, muss der na.action
Parameter in den Funktionsaufruf aufgenommen werden, z.
lm(y2 ~ y1, data = anscombe, na.action = 'na.exclude')