Filtern von NA Werten

Oftmals bekommen wir Datensätze, in denen für einzelne Werte NA gespeichert ist. Dies beschreibt fehlende Werte, und in Abhängigkeit vom Datensatz und den zu bearbeitenden Forschungsfragen wollen wir möglicherweise Zeilen, welche den Wert NA haben, herauswerfen. Hier sind zwei Möglichkeiten beschrieben, wie dies machbar ist. Dazu nehmen wir uns den Datensatz aus den Beispielen von Woche 4, nun allerdings mit ein paar NA Werten:

df <- data.frame(
  Id = seq(1, 5, 1),
  Name = c("Anna", "Stephan", "Ina", "Matthias", "Katrin"),
  Geschlecht = as.factor(c("Weiblich", NA, "Weiblich", "Männlich", "Weiblich")),
  Alter = c(25, 22, 19, 29, 17),
  Groesse_m = c(1.75, 1.60, NA, 1.95, 1.67),
  Gewicht_kg = c(60, 70, 65, 80, NA)
)
df
  Id     Name Geschlecht Alter Groesse_m Gewicht_kg
1  1     Anna   Weiblich    25      1.75         60
2  2  Stephan       <NA>    22      1.60         70
3  3      Ina   Weiblich    19        NA         65
4  4 Matthias   Männlich    29      1.95         80
5  5   Katrin   Weiblich    17      1.67         NA

Filtern mittels na.omit()

Mit na.omit() werden alle Zeilen herausgeworfen, in denen irgendwo ein NA-Wert ist:

df_clean <- na.omit(df)
df_clean
  Id     Name Geschlecht Alter Groesse_m Gewicht_kg
1  1     Anna   Weiblich    25      1.75         60
4  4 Matthias   Männlich    29      1.95         80

Filtern mittels complete.cases()

Ein bisschen flexibler ist die Nutzung von complete.cases(). Zum beispiel hätten wir ja die Zeile Id=2 gerne behalten, da hier lediglich die Information zum Geschlecht fehlt, alles andere jedoch vorhanden ist. Mit der Funktion complete.cases() können wir Zeilenindizes erfragen, in welchen in bestimmten Spalten NA-Werte auftreten. Diese werden mit FALSE beschrieben (da sie ja nicht complete sind)

cases <- complete.cases(df[4:6])
cases
[1]  TRUE  TRUE FALSE  TRUE FALSE

mittels Indizierung können wir nun die entsprechenden Zeilen herauswerfen:

df_clean <- df[cases,]
df_clean
  Id     Name Geschlecht Alter Groesse_m Gewicht_kg
1  1     Anna   Weiblich    25      1.75         60
2  2  Stephan       <NA>    22      1.60         70
4  4 Matthias   Männlich    29      1.95         80

Filtern in tidyverse

Natürlich können wir die ganze Sache auch im tidyverse machen. Hier gibt es wieder die zwei Möglichkeiten: (1) alle NA Werte unabhängig von den Spalten, (2) NA Werte innerhalb bestimmter Spalten. IN beiden Fällen ist die betreffende Funtion drop_na()

df_clean <- df %>% drop_na()
df_clean
  Id     Name Geschlecht Alter Groesse_m Gewicht_kg
1  1     Anna   Weiblich    25      1.75         60
2  4 Matthias   Männlich    29      1.95         80
df_clean <- df %>% drop_na(c(Alter, Groesse_m, Gewicht_kg))
df_clean
  Id     Name Geschlecht Alter Groesse_m Gewicht_kg
1  1     Anna   Weiblich    25      1.75         60
2  2  Stephan       <NA>    22      1.60         70
3  4 Matthias   Männlich    29      1.95         80