NA in R – Umgang mit fehlenden Werten
Fehlende Werte sind in Datensätzen ein häufig auftretendes Problem, das besondere Herausforderungen an die Datenanalyse stellt. In R werden fehlende Werte als NA
, also „not available“ bezeichnet. In diesem Blogpost wollen wir uns nochmals ansehen, wie man mit NA in R umgeht und dabei einige Fragen beantworten, die im früheren Beitrag noch nicht beantwortet wurden.
NA in R
In R werden fehlende Werte durch den speziellen Wert NA
dargestellt. Fehlende Werte können in vielen Situationen auftreten, z. B. wenn Daten nicht erhoben, gemessen oder aufgezeichnet wurden.
# Einfaches Beispiel
x <- c(1, 2, NA, 4)
NAs in einem Datensatz erkennen und darstellen
Um die Anzahl der fehlenden Werte in einem Datensatz zu ermitteln, kann man die Funktion is.na()
verwenden, die einen logischen Vektor der gleichen Länge wie der Eingabevektor zurückgibt. Um die Anzahl der NAs in jedem Feld eines Data Frames (oder Data Tables) zu zählen, kann man die Funktion apply()
verwenden:
# Beispiel-Datensatz
data <- data.frame(
id=1:5,
age=c(25, 33, NA, 29, 41),
gender=c("M", "F", "F", NA, "M")
)
# Anzahl der NAs pro Spalte ermitteln
apply(data, 2, function(x) sum(is.na(x)))
Fehlende Werte in Tabellen entfernen
Manchmal ist es notwendig, fehlende Werte in Dataframes vollständig zu entfernen (= die Fälle entfernen, die mind. einen fehlenden Wert beinhalten). Hierfür kann man die Funktion na.omit()
verwenden:
data_no_na <- na.omit(data)
Umgang mit speziellen Werten in Daten
Manchmal werden in Datensätzen spezielle Werte wie 88 für „weiß nicht“ oder 99 für „Antwort verweigert“ verwendet. Um diese Werte in NAs umzuwandeln, kann man die Funktion replace()
verwenden:
data$education <- replace(data$education, data$education %in% c(88, 99), NA)
Subsets erstellen, ohne ganze Zeilen zu verlieren
Um Subsets zu erstellen, ohne dabei ganze Zeilen mit NAs zu entfernen, kann man die Funktion subset()
verwenden:
subset_data <- subset(data, !is.na(condition))
NA und Warnungen bei statistischen Funktionen
Wenn man versucht, deskriptive Statistiken wie den Durchschnitt für Spalten mit NAs zu berechnen, erhält man möglicherweise ein NA
als Resultat. Um dies zu vermeiden und den Durchschnitt korrekt zu berechnen, sollte man das Argument na.rm = TRUE
verwenden:
mean(data$age, na.rm=TRUE)
Falscher Datentyp für statistische Funktionen
Auch kann es sein, dass man folgende Fehlermeldung erhält: „argument is not numeric or logical: returning NA“ bzw. „Argument ist weder numerisch noch boolesch: gebe NA zurück“. In diesem Fall kann es gut sein, dass der Vektor vom Typ character ist und vorher noch in numeric (oder integer) umgewandelt werden muss.
vec <- as.numeric(vec)
mean(vec, na.rm=TRUE)
Interpolation von NA in R
In einigen Fällen kann es sinnvoll sein, fehlende Werte durch interpolierte Werte zu ersetzen. Hierfür kann man die Funktion na.approx()
aus dem Package zoo
verwenden:
# Beispiel: Interpolation von fehlenden Werten
library(zoo)
x <- c(1, 2, NA, 4)
x_interpolated <- na.approx(x)
NA in Zeitreihen: Fortschreiben des letzten Werts
Neben der Interpolation können wir auch den letzten validen Wert fortschreiben. Dazu verwenden wir die Funktion na.locf()
(„last observation carried forward“), auch aus dem Package zoo
:
# Beispiel: Fehlende Werte in einer Zeitreihe ersetzen
library(zoo)
ts_data <- c(1, 2, NA, 4)
ts_data_no_na <- na.locf(ts_data)
Fazit
Insgesamt gibt es viele Möglichkeiten, um in R mit fehlenden Werten umzugehen. Die Wahl der richtigen Methode hängt von der Art der Daten und dem spezifischen Anwendungsfall ab. Im Folgenden sind einige wichtige Punkte zusammengefasst:
- Die Funktion
is.na()
identifiziert fehlende Werte in Vektoren oder Data Frames. - Statistische Funktionen wie
sum()
undmean()
bieten den optionalen Parameterna.rm
, um fehlende Werte bei der Berechnung zu ignorieren. - Fehlende Werte können durch andere Werte, wie z.B. 0, ersetzt werden, indem man die Funktionen
ifelse()
oderreplace()
verwendet. - Die Funktion
na.omit()
kann verwendet werden, um Zeilen mit fehlenden Werten aus einem Data Frame zu entfernen. - Für den Umgang mit fehlenden Werten in Zeitreihen gibt es spezielle Funktionen wie
na.locf()
oderna.approx()
aus dem Paketzoo
.
Hast du noch mehr Fragen zu NA in R oder ein bestimmtes Problem in einem anderen Bereich? Schreib mir einfach eine Mail: mail@r-coding.de.
Bleib außerdem auf dem Laufenden mit dem r-coding Newsletter. Du erhältst Infos zu neuen Blogeinträgen, sowie kleine Tipps und Tricks zu R. Melde dich jetzt an: http://r-coding.de/newsletter.
Viel Erfolg!