So ersetzen Sie fehlende Werte (NA) in R: na.omit & na.rm

Fehlende Werte in der Datenwissenschaft entstehen, wenn eine Beobachtung in einer Spalte eines Datenrahmens fehlt oder einen Zeichenwert anstelle eines numerischen Werts enthรคlt. Fehlende Werte mรผssen gelรถscht oder ersetzt werden, um aus den Daten korrekte Schlussfolgerungen ziehen zu kรถnnen.

In diesem Tutorial lernen wir, wie man mit der dplyr-Bibliothek mit fehlenden Werten umgeht. Die dplyr-Bibliothek ist Teil eines ร–kosystems zur Durchfรผhrung einer Datenanalyse.

Ersetzen Sie fehlende Werte in R

In diesem Tutorial lernst du

mutieren()

Das vierte Verb im dplyr-Bibliothek ist hilfreich, um eine neue Variable zu erstellen oder die Werte einer vorhandenen Variablen zu รคndern.

Wir werden in zwei Teilen vorgehen. Wir werden lernen, wie man:

  • Fehlende Werte aus einem Datenrahmen ausschlieรŸen
  • fehlende Werte mit Mittelwert und Median unterstellen

Das Verb mutate() ist sehr einfach zu verwenden. Wir kรถnnen eine neue Variable mit dieser Syntax erstellen:

mutate(df, name_variable_1 = condition, ...)
arguments:
-df: Data frame used to create a new variable
-name_variable_1: Name and the formula to create the new variable
-...: No limit constraint. Possibility to create more than one variable inside mutate()

Fehlende Werte ausschlieรŸen (NA)

Die Methode na.omit() aus der dplyr-Bibliothek ist eine einfache Mรถglichkeit, fehlende Beobachtungen auszuschlieรŸen. Alle NA aus den Daten zu entfernen ist einfach, aber das bedeutet nicht, dass es die eleganteste Lรถsung ist. Wรคhrend der Analyse ist es ratsam, verschiedene Methoden zu verwenden, um mit fehlenden Werten umzugehen

Um das Problem fehlender Beobachtungen anzugehen, werden wir den Titanic-Datensatz verwenden. In diesem Datensatz haben wir Zugriff auf die Informationen der Passagiere an Bord wรคhrend der Tragรถdie. Dieser Datensatz enthรคlt viele NA, die berรผcksichtigt werden mรผssen.

Wir laden die CSV-Datei aus dem Internet hoch und prรผfen dann, welche Spalten NA haben. Um die Spalten mit fehlenden Daten zurรผckzugeben, kรถnnen wir den folgenden Code verwenden:

Lassen Sie uns die Daten hochladen und die fehlenden Daten รผberprรผfen.

PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/test.csv"
df_titanic <- read.csv(PATH, sep = ",")
# Return the column names containing missing observations
list_na <- colnames(df_titanic)[ apply(df_titanic, 2, anyNA) ]
list_na

Ausgang:

## [1] "age"  "fare"

Dabei steht:

colnames(df_titanic)[apply(df_titanic, 2, anyNA)]

Gibt den Namen von Spalten an, die keine Daten enthalten.

In den Spalten โ€žAlterโ€œ und โ€žTarifโ€œ fehlen Werte.

Wir kรถnnen sie mit na.omit() lรถschen.

library(dplyr)
# Exclude the missing observations
df_titanic_drop <-df_titanic %>%
na.omit()		
dim(df_titanic_drop)

Ausgang:

## [1] 1045   13

Der neue Datensatz enthรคlt 1045 Zeilen im Vergleich zu 1309 im ursprรผnglichen Datensatz.

Fehlende Werte ausschlieรŸen

Imputieren Sie fehlende Daten mit dem Mittelwert und dem Median

Wir kรถnnten fehlende Werte auch mit dem Median oder dem Mittelwert unterstellen (auffรผllen). Eine gute Vorgehensweise besteht darin, zwei separate Variablen fรผr den Mittelwert und den Median zu erstellen. Nach der Erstellung kรถnnen wir die fehlenden Werte durch die neu gebildeten Variablen ersetzen.

Wir werden die Apply-Methode verwenden, um den Mittelwert der Spalte mit NA zu berechnen. Sehen wir uns ein Beispiel an

Schritt 1) Zu Beginn des Tutorials haben wir den Spaltennamen mit den fehlenden Werten in der Liste list_na gespeichert. Wir werden diese Liste verwenden

Schritt 2) Jetzt mรผssen wir den Mittelwert mit dem Argument na.rm = TRUE berechnen. Dieses Argument ist obligatorisch, da in den Spalten Daten fehlen, und dies weist R an, diese zu ignorieren.

# Create mean
average_missing <- apply(df_titanic[,colnames(df_titanic) %in% list_na],
      2,
      mean,
      na.rm =  TRUE)
average_missing

Code-Erklรคrung:

Wir รผbergeben 4 Argumente in der apply-Methode.

  • df: df_titanic[,colnames(df_titanic) %in% list_na]. Dieser Code gibt den Spaltennamen aus dem list_na-Objekt zurรผck (z. B. โ€žAlterโ€œ und โ€žFahrpreisโ€œ).
  • 2: Berechnen Sie die Funktion fรผr die Spalten
  • Mittelwert: Berechnen Sie den Mittelwert
  • na.rm = TRUE: Fehlende Werte ignorieren

Ausgang:

##      age     fare 
## 29.88113 33.29548

Wir haben erfolgreich den Mittelwert der Spalten erstellt, die fehlende Beobachtungen enthalten. Diese beiden Werte werden verwendet, um die fehlenden Beobachtungen zu ersetzen.

Schritt 3) Ersetzen Sie die NA-Werte

Das Verb mutate aus der dplyr-Bibliothek ist nรผtzlich beim Erstellen einer neuen Variablen. Wir mรถchten nicht unbedingt die ursprรผngliche Spalte รคndern, damit wir eine neue Variable ohne NA erstellen kรถnnen. Mutate ist einfach zu verwenden. Wir wรคhlen einfach einen Variablennamen und definieren, wie diese Variable erstellt wird. Hier ist der vollstรคndige Code

# Create a new variable with the mean and median
df_titanic_replace <- df_titanic %>%
   mutate(replace_mean_age  = ifelse(is.na(age), average_missing[1], age),
   replace_mean_fare = ifelse(is.na(fare), average_missing[2], fare))

Code-Erklรคrung:

Wir erstellen zwei Variablen, replace_mean_age und replace_mean_fare, wie folgt:

  • replace_mean_age = ifelse(is.na(age), Average_missing[1], age)
  • replace_mean_fare = ifelse(is.na(fare), Average_missing[2],fare)

Wenn in der Spalte โ€žAlterโ€œ Werte fehlen, ersetzen Sie diese durch das erste Element von โ€žaverage_missingโ€œ (Mittelwert des Alters). Andernfalls behalten Sie die ursprรผnglichen Werte bei. Dieselbe Logik fรผr den Fahrpreis

sum(is.na(df_titanic_replace$age))

Ausgang:

## [1] 263

Fรผhren Sie den Austausch durch

sum(is.na(df_titanic_replace$replace_mean_age))

Ausgang:

## [1] 0

In der ursprรผnglichen Spalte โ€žAlterโ€œ fehlen 263 Werte, wรคhrend die neu erstellte Variable diese durch den Mittelwert der Variablen โ€žAlterโ€œ ersetzt hat.

Schritt 4) Wir kรถnnen die fehlenden Beobachtungen auch durch den Median ersetzen.

median_missing <- apply(df_titanic[,colnames(df_titanic) %in% list_na],
      2,
      median,
      na.rm =  TRUE)
df_titanic_replace <- df_titanic %>%
            mutate(replace_median_age  = ifelse(is.na(age), median_missing[1], age), 
            replace_median_fare = ifelse(is.na(fare), median_missing[2], fare))
head(df_titanic_replace)

Ausgang:

Imputieren Sie fehlende Daten mit dem Mittelwert und dem Median

Schritt 5) Bei einem groรŸen Datensatz kรถnnten viele Werte fehlen und die obige Methode kรถnnte umstรคndlich sein. Mit der Methode sapply() kรถnnen wir alle oben genannten Schritte in einer Codezeile ausfรผhren. Allerdings kennen wir die Werte von Mittelwert und Median nicht.

sapply erstellt kein Datenrahmen, sodass wir die Funktion sapply() in data.frame() einschlieรŸen kรถnnen, um ein Datenrahmenobjekt zu erstellen.

# Quick code to replace missing values with the mean
df_titanic_impute_mean < -data.frame(
    sapply(
        df_titanic,
        function(x) ifelse(is.na(x),
            mean(x, na.rm = TRUE),
            x)))

Zusammenfassung

Wir haben drei Methoden, um mit fehlenden Werten umzugehen:

  • SchlieรŸen Sie alle fehlenden Beobachtungen aus
  • Mit dem Mittelwert imputieren
  • Mit dem Median imputieren

Die folgende Tabelle fasst zusammen, wie alle fehlenden Beobachtungen entfernt werden kรถnnen

Bibliothek Ziel Code
Base Listen Sie fehlende Beobachtungen auf
colnames(df)[apply(df, 2, anyNA)]
dplyr Entfernen Sie alle fehlenden Werte
na.omit(df)

Die Imputation mit Mittelwert oder Median kann auf zwei Arten erfolgen

  • Mit apply
  • Verwendung von Sapply
Methodik Details Vorteile Nachteile
Schritt fรผr Schritt mit bewerben รœberprรผfen Sie die fehlenden Spalten, berechnen Sie den Mittelwert/Median, speichern Sie den Wert und ersetzen Sie ihn durch mutate() Sie kennen den Wert von Mittelwert/Median Mehr Ausfรผhrungszeit. Kann bei groรŸen Datensรคtzen langsam sein
Schneller Weg mit Sapply Verwenden Sie sapply() und data.frame(), um fehlende Werte automatisch zu suchen und durch Mittelwert/Median zu ersetzen Kurzer Code und schnell Kenne die Imputationswerte nicht

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: