Sostituisci NA con zero in R

Gustavo du Mortier 30 gennaio 2023
  1. Sostituisci NA con zero in DataFrame R più grandi
  2. Sostituisci NA con zero in un sottoinsieme di DataFrame R
Sostituisci NA con zero in R

C’è un modo semplice per sostituire NA con zeri in un DataFrame in R. Supponiamo di avere un DataFrame chiamato my_data. Per sostituire tutti i valori NA con zero in quel data frame, puoi eseguire questa istruzione.

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

Ad esempio, se my_data ha il contenuto seguente.

   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

Quando si esegue my_data[is.na(my_data)] <- 0 il contenuto del data frame cambia in questo.

   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

Sostituisci NA con zero in DataFrame R più grandi

La soluzione precedente utilizza le riassegnazioni del sottoinsieme Base R, che funzionano bene quando si hanno DataFrame relativamente piccoli. Ma per set di dati più grandi, potresti aver bisogno di un’alternativa più veloce, come il nuovo approccio di valutazione ibrido implementato nelle versioni recenti del pacchetto dplyr.

Il nuovo approccio impiegato dal pacchetto dplyr riconosce intere espressioni e utilizza il codice C++ per valutarle. In questo modo, puoi ottenere trasformazioni fino al 30% più veloci durante l’elaborazione di frame di big data.

Per sostituire i valori NA con zeri usando il pacchetto dplyr, puoi usare la funzione mutate con il verbo con scope _all e la funzione replace nel formato purrr, come nell’esempio sotto.

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

L’uso della notazione purrr ci permette di applicare la funzione replace ad ogni elemento del data frame.

Sostituisci NA con zero in un sottoinsieme di DataFrame R

Invece del verbo con scope _all nella funzione mutate, puoi usare il verbo con scope _at per limitare l’azione di sostituzione a colonne specifiche. Per fare ciò, puoi includere un vettore con i nomi delle colonne in cui desideri applicare la sostituzione. Utilizzando il data frame precedente, se è necessario sostituire i valori NA solo nelle colonne C1 e C4, è possibile utilizzare il seguente comando:

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

In questo modo, solo le NA nelle colonne C1 e C4 vengono sostituite da 0, risultando in un DataFrame come di seguito.

   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

Nell’esempio precedente, potresti aver voluto sostituire NA con zeri solo nelle colonne numeriche per evitare di includere valori zero nelle colonne alfanumeriche come C3. Se è così, invece di specificare le colonne dove vuoi applicare la sostituzione, puoi usare la funzione mutate_if con la condizione is.numeric per dire a R di sostituire NA con zeri solo nelle colonne numeriche. Nell’esempio seguente, puoi trovare il codice completo per provarlo, dall’installazione del pacchetto dplyr e dal popolamento del data frame all’esecuzione delle sostituzioni e alla visualizzazione dei risultati.

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

Produzione:

   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

Puoi trovare maggiori informazioni sulla funzione mutate() e le sue varianti nella Documentazione R.

Articolo correlato - R Data Frame