HOWTO · R
Zeilen mit NA in einer Spalte in R entfernen
Dieses Tutorial zeigt, wie Sie Zeilen mit NA in einer Spalte aus einem Datenrahmen in R entfernen.
Auf dieser Seite
Um Zeilen zu entfernen, in denen eine ausgewählte Spalte NA enthält, behalten Sie die Zeilen, für die is.na() den Wert FALSE ergibt. Für einen Data Frame df mit einer Spalte namens score verwenden Sie den Base-R-Ausdruck df[!is.na(df$score), ]. NA ist in R die Kennzeichnung für einen fehlenden Wert und nicht der wörtliche Text "NA". Da die Bedingung nur score prüft, wirken sich fehlende Werte in anderen Spalten nicht darauf aus, welche Zeilen erhalten bleiben.
Zeilen mit NA in einer Spalte mit is.na() in R entfernen
is.na() liefert für jedes Element einen logischen Wert und kennzeichnet fehlende Werte mit TRUE. Wenn Sie dieses Ergebnis negieren und als Zeilenindex verwenden, wählen Sie die nicht fehlenden Einträge aus. Im Beispiel wird das Ergebnis kept zugewiesen; der ursprüngliche Data Frame df bleibt dadurch verfügbar. Die Ausgabe zeigt die Anzahl der erhaltenen Zeilen sowie deren IDs und Werte in score.
df <- data.frame(id = c(1, 2, 3), score = c(10, NA, 30))
kept <- df[!is.na(df$score), ]
cat("Rows retained:", nrow(kept), "\n")
cat("IDs:", paste(kept$id, collapse = ", "), "\n")
cat("Scores:", paste(kept$score, collapse = ", "), "\n")
Ersetzen Sie score durch den Namen Ihrer Spalte. Das allgemeine Muster lautet df[!is.na(df$column), ]. Der Ausdruck gibt einen gefilterten Data Frame zurück. Wenn Sie ihn kept zuweisen, bleibt df in seiner ursprünglichen Form verfügbar. Entscheidend ist der Zeilenindex: Er wendet die logische Prüfung auf die ausgewählte Spalte an und behält die passenden Zeilen im gesamten Data Frame.
Zeilen mit NA in einer Spalte mit complete.cases() in R entfernen
complete.cases() liefert für jede Zeile einen logischen Wert, der angibt, ob die übergebenen Eingaben vollständig sind. Wenn Sie nur eine Spalte übergeben, beschränkt sich die Prüfung auf diese Spalte: df[complete.cases(df$score), ]. Übergeben Sie stattdessen den gesamten Data Frame, werden alle Spalten geprüft. Dadurch können Zeilen auch wegen fehlender Werte außerhalb von score entfernt werden. Verwenden Sie die Variante mit einer Spalte, wenn andere Spalten keinen Einfluss darauf haben sollen, welche Zeilen erhalten bleiben. Sie wählt dieselben Zeilen aus wie das Muster mit is.na(). Diese Funktion gehört zu Base R und benötigt daher kein zusätzliches Paket.
Zeilen mit NA in einer Spalte mit drop_na() in R entfernen
Die Funktion drop_na() gehört zum Paket tidyr. Mit tidyr::drop_na(df, score) behalten Sie die Zeilen, in denen score einen Wert enthält. Durch die Angabe der Spalte wird die Prüfung auf sie beschränkt. Falls tidyr noch nicht installiert ist, installieren Sie es mit install.packages("tidyr"). Der Aufruf gibt einen gefilterten Data Frame zurück. Weisen Sie das Ergebnis einem Namen zu, wenn Sie es speichern und weiterverwenden möchten. Ohne Spaltenargument prüft drop_na(df) alle Spalten. Geben Sie daher die Zielspalte an, wenn andere Spalten nicht darüber entscheiden sollen, welche Zeilen erhalten bleiben.
Zeilen mit NA in einer Spalte mit na.omit() in R entfernen
Auf einen vollständigen Data Frame angewendet, entfernt na.omit(df) jede Zeile, die in irgendeiner Spalte NA enthält. Das ist umfassender als eine Filterung, die nur eine Zielspalte berücksichtigt. Auch wenn Sie na.omit() auf einen Data Frame anwenden, den Sie zuvor mit !is.na(df$score) gefiltert haben, können Zeilen wegen fehlender Werte in anderen Spalten entfernt werden. Verwenden Sie für diese Aufgabe direkt df[!is.na(df$score), ]; damit werden die Zeilen ausschließlich anhand von score ausgewählt. na.omit() eignet sich, wenn Sie Zeilen entfernen möchten, die irgendwo im Data Frame unvollständig sind.
Zeilen mit NA in einer Spalte mit subset() in R entfernen
subset() ist eine gut lesbare Alternative aus Base R: subset(df, !is.na(score)). Die Funktion wertet die Bedingung anhand der Spalten des Data Frames aus; score bezieht sich also auf die gleichnamige Spalte in df. Andere Spalten gehen nicht in die Bedingung ein. Der zurückgegebene Data Frame enthält die Zeilen, die sie erfüllen. Weisen Sie das Ergebnis zum Beispiel mit kept <- subset(df, !is.na(score)) zu, um es weiterzuverwenden und zugleich den ursprünglichen Data Frame df beizubehalten. Wie beim Indexausdruck bestimmt der Spaltenname in der Bedingung, welche Zeilen ausgewählt werden.
Zeilen mit NA in einer Spalte mit filter() in R entfernen
Die Funktion filter() aus dem Paket dplyr wählt Zeilen anhand einer Bedingung aus. Mit dplyr::filter(df, !is.na(score)) wenden Sie die Bedingung auf score an. Falls das Paket noch nicht verfügbar ist, installieren Sie es mit install.packages("dplyr"). Der Aufruf gibt einen Data Frame zurück und überschreibt df nicht. Weisen Sie das Ergebnis zu, wenn Sie die gefilterten Daten später verwenden möchten. Da die Bedingung nur score nennt, entscheiden fehlende Werte in anderen Spalten nicht darüber, welche Zeilen dieser Aufruf behält.
Fazit
Für eine ausgewählte Spalte ist df[!is.na(df$column), ] eine direkte Lösung mit Base R. Eine ähnliche Auswahlmaske bietet complete.cases(df$column). Verwenden Sie tidyr::drop_na() oder dplyr::filter(), wenn diese Pakete bereits zu Ihrem Arbeitsablauf gehören. Beachten Sie, dass na.omit(df) auf einem vollständigen Data Frame auch Zeilen entfernen kann, weil in anderen als der gewünschten Spalte NA vorkommt. Verwenden Sie eine Bedingung für genau eine Spalte, wenn nur diese Spalte darüber entscheiden soll, welche Zeilen erhalten bleiben.