Ersetzen von NA durch Null in R

Gustavo du Mortier 30 Januar 2023
  1. Ersetzen von NA durch Null in größeren R-Datenframes
  2. Ersetzen von NA durch Null in einer Teilmenge des R-DataFrame
Ersetzen von NA durch Null in R

Es gibt eine einfache Möglichkeit, in R NA in einem Datenframe durch Nullen zu ersetzen. Angenommen, Sie haben einen Datenframe namens my_data. Um alle NA-Werte durch Nullen in diesem Datenframe zu ersetzen, können Sie diese Anweisung ausführen.

my_data[is.na(my_data)] <- 0

Zum Beispiel, wenn my_data den folgenden Inhalt hat.

   C1  C2    C3  C4  C5
1   4   3  <NA>   3   7
2   9   8   ABC   5  10
3   1   1   XYZ   3   6
4  NA   4  <NA>   7  10
5   1   2   ZC1  NA   2

Wenn Sie my_data[is.na(my_data)] <- 0 ausführen, ändert sich der Inhalt des DataFrame wie folgt.

   C1  C2    C3  C4  C5
1   4   3     0   3   7
2   9   8   ABC   5  10
3   1   1   XYZ   3   6
4   0   4     0   7  10
5   1   2   ZC1   0   2

Ersetzen von NA durch Null in größeren R-Datenframes

Die vorherige Lösung verwendet die Basis-R-Subset-Neuzuordnungen, die gut funktionieren, wenn Sie relativ kleine DataFrame haben. Aber für größere Datensätze benötigen Sie möglicherweise eine schnellere Alternative, wie den neuen hybriden Auswertungsansatz, der in neueren Versionen des Pakets dplyr implementiert ist.

Der neue Ansatz des dplyr-Pakets erkennt ganze Ausdrücke und verwendet C++-Code, um sie auszuwerten. Auf diese Weise können Sie bei der Verarbeitung großer DataFrame bis zu 30 % schnellere Transformationen erreichen.

Um mit dem dplyr-Paket NA-Werte durch Nullen zu ersetzen, können Sie die Funktion mutate mit dem scoped verb _all und die Funktion replace im Format purrr verwenden, wie im folgenden Beispiel.

my_data <- mutate_all(my_data, ~replace(., is.na(.), 0))

Die Verwendung der Notation purrr ermöglicht es uns, die Funktion replace auf jedes DataFrameelement anzuwenden.

Ersetzen von NA durch Null in einer Teilmenge des R-DataFrame

Anstelle des Verbs _all in der Funktion mutate können Sie das Verb _at verwenden, um die Ersetzungsaktion auf bestimmte Spalten zu beschränken. Dazu können Sie einen Vektor mit den Namen der Spalten einschließen, auf die die Ersetzung angewendet werden soll. Wenn Sie unter Verwendung des vorherigen DataFrame nur die NA-Werte in den Spalten C1 und C4 ersetzen müssen, können Sie den folgenden Befehl verwenden:

my_data <- mutate_at(my_data, c("C1", "C4"), ~replace(., is.na(.), 0))

Auf diese Weise werden nur die NA-Werte in den Spalten C1 und C4 durch 0 ersetzt, was zu einem DataFrame wie unten führt.

   C1  C2    C3  C4  C5
1   4   3  <NA>   3   7
2   9   8   ABC   5  10
3   1   1   XYZ   3   6
4   0   4  <NA>   7  10
5   1   2   ZC1   0   2

Im vorherigen Beispiel hätten Sie vielleicht nur in numerischen Spalten NA durch Nullen ersetzen wollen, um zu vermeiden, dass Nullwerte in alphanumerischen Spalten wie C3 enthalten sind. Wenn das der Fall ist, können Sie, anstatt die Spalten anzugeben, auf die Sie die Ersetzung anwenden wollen, die Funktion mutate_if mit der Bedingung is.numeric verwenden, um R zu sagen, dass NA nur in numerischen Spalten durch Nullen ersetzt werden soll. Im folgenden Beispiel finden Sie den kompletten Code, um dies auszuprobieren, von der Installation des dplyr-Pakets und dem Auffüllen des DataFrame bis zur Durchführung der Ersetzungen und der Anzeige der Ergebnisse.

install.packages("dplyr")
library(dplyr)
C1 <- c(4, 9, 1, NA, 1)
C2 <- c(3, 8, 1, 4, 2)
C3 <- c(NA, 'ABC', 'XYZ', NA, 'ZC1')
C4 <- c(3, 5, 3, 7, NA)
C5 <- c(7, 10, NA, 10, 2)
my_data <- data.frame(C1, C2, C3, C4, C5)
my_data <- mutate_if(my_data, is.numeric, ~replace(., is.na(.), 0))
my_data

Ausgabe:

   C1  C2    C3  C4  C5
1   4   3  <NA>   3   7
2   9   8   ABC   5  10
3   1   1   XYZ   3   0
4   0   4  <NA>   7  10
5   1   2   ZC1   0   2

Weitere Informationen über die Funktion mutate() und ihre Varianten finden Sie in der R-Dokumentation.

Verwandter Artikel - R Data Frame