Come sostituire i valori mancanti (NA) in R: na.omit e na.rm
I valori mancanti nella scienza dei dati si verificano quando un'osservazione manca in una colonna di un frame di dati o contiene un valore di carattere anzichรฉ un valore numerico. I valori mancanti devono essere eliminati o sostituiti per trarre la conclusione corretta dai dati.
In questo tutorial impareremo come gestire i valori mancanti con la libreria dplyr. La libreria dplyr fa parte di un ecosistema per realizzare un'analisi dei dati.
In questo tutorial imparerai
mutare()
Il quarto verbo del libreria dplyr รจ utile per creare una nuova variabile o modificare i valori di una variabile esistente.
Procederemo in due parti. Impareremo come:
- escludere i valori mancanti da un frame di dati
- imputare i valori mancanti alla media e alla mediana
Il verbo mutate() รจ molto facile da usare. Possiamo creare una nuova variabile seguendo questa sintassi:
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()
Escludi valori mancanti (NA)
Il metodo na.omit() della libreria dplyr รจ un modo semplice per escludere le osservazioni mancanti. Eliminare tutti i NA dai dati รจ facile, ma non significa che sia la soluzione piรน elegante. Durante l'analisi, รจ saggio usare vari metodi per gestire i valori mancanti
Per affrontare il problema delle osservazioni mancanti, utilizzeremo il set di dati Titanic. In questo set di dati abbiamo accesso alle informazioni dei passeggeri a bordo durante la tragedia. Questo set di dati ha molte NA di cui occuparsi.
Caricheremo il file csv da internet e poi controlleremo quali colonne hanno NA. Per restituire le colonne con dati mancanti, possiamo usare il seguente codice:
Carichiamo i dati e verifichiamo i dati mancanti.
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
Produzione:
## [1] "age" "fare"
Qui,
colnames(df_titanic)[apply(df_titanic, 2, anyNA)]
Fornisce il nome delle colonne che non contengono dati.
Nelle colonne etร e tariffa mancano valori.
Possiamo eliminarli con na.omit().
library(dplyr) # Exclude the missing observations df_titanic_drop <-df_titanic %>% na.omit() dim(df_titanic_drop)
Produzione:
## [1] 1045 13
Il nuovo set di dati contiene 1045 righe rispetto alle 1309 del set di dati originale.
Assegnare i dati mancanti alla media e alla mediana
Potremmo anche imputare (popolare) i valori mancanti con la mediana o la media. Una buona pratica รจ creare due variabili separate per la media e la mediana. Una volta creati, possiamo sostituire i valori mancanti con le variabili appena formate.
Utilizzeremo il metodo apply per calcolare la media della colonna con NA. Vediamo un esempio
Passo 1) In precedenza nel tutorial, abbiamo archiviato il nome delle colonne con i valori mancanti nell'elenco chiamato list_na. Utilizzeremo questo elenco
Passo 2) Ora dobbiamo calcolare la media con l'argomento na.rm = TRUE. Questo argomento รจ obbligatorio perchรฉ le colonne hanno dati mancanti e questo dice a R di ignorarli.
# Create mean
average_missing <- apply(df_titanic[,colnames(df_titanic) %in% list_na],
2,
mean,
na.rm = TRUE)
average_missing
Spiegazione del codice:
Passiamo 4 argomenti nel metodo apply.
- df: df_titanic[,colnames(df_titanic) %in% list_na]. Questo codice restituirร il nome delle colonne dall'oggetto list_na (ad esempio "age" e "fare")
- 2: Calcola la funzione sulle colonne
- media: calcola la media
- na.rm = TRUE: ignora i valori mancanti
Produzione:
## age fare ## 29.88113 33.29548
Abbiamo creato con successo la media delle colonne contenenti le osservazioni mancanti. Questi due valori verranno utilizzati per sostituire le osservazioni mancanti.
Passo 3) Sostituisci i valori NA
Il verbo mutate dalla libreria dplyr รจ utile per creare una nuova variabile. Non vogliamo necessariamente modificare la colonna originale, quindi possiamo creare una nuova variabile senza NA. mutate รจ facile da usare, basta scegliere un nome di variabile e definire come creare questa variabile. Ecco il codice completo
# 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))
Spiegazione del codice:
Creiamo due variabili, replace_mean_age e replace_mean_fare come segue:
- replace_mean_age = ifelse(is.na(age), Average_missing[1], age)
- replace_mean_fare = ifelse(is.na(tariffa), Average_missing[2],tariffa)
Se la colonna etร presenta valori mancanti, sostituiscili con il primo elemento di Average_missing (media dell'etร ), altrimenti mantieni i valori originali. Stessa logica per la tariffa
sum(is.na(df_titanic_replace$age))
Produzione:
## [1] 263
Eseguire la sostituzione
sum(is.na(df_titanic_replace$replace_mean_age))
Produzione:
## [1] 0
La colonna etร originale ha 263 valori mancanti mentre la variabile appena creata li ha sostituiti con la media della variabile etร .
Passo 4) Possiamo anche sostituire le osservazioni mancanti con la mediana.
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)
Produzione:
Passo 5) Un set di big data potrebbe contenere molti valori mancanti e il metodo sopra descritto potrebbe essere complicato. Possiamo eseguire tutti i passaggi precedenti in una riga di codice utilizzando il metodo sapply(). Anche se non conosceremmo i valori di media e mediana.
sapply non crea un file Frame dati, quindi possiamo racchiudere la funzione sapply() all'interno di data.frame() per creare un oggetto frame di dati.
# 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)))
Sintesi
Abbiamo tre metodi per gestire i valori mancanti:
- Escludere tutte le osservazioni mancanti
- Imputare con la media
- Imputare con la mediana
La tabella seguente riassume come rimuovere tutte le osservazioni mancanti
| Biblioteca | Obiettivo | Code |
|---|---|---|
| base | Elenca le osservazioni mancanti |
colnames(df)[apply(df, 2, anyNA)] |
| dplyr | Rimuovi tutti i valori mancanti |
na.omit(df) |
L'imputazione con media o mediana puรฒ essere effettuata in due modi
- Usando applica
- Utilizzando sapply
| Metodo | Dettagli | Vantaggi | Svantaggi |
|---|---|---|---|
| Passo dopo passo con l'applicazione | Controlla le colonne mancanti, calcola la media/mediana, memorizza il valore, sostituisci con mutate() | Conosci il valore di media/mediana | Piรน tempo di esecuzione. Puรฒ essere lento con set di dati di grandi dimensioni |
| Modo rapido con Sapply | Utilizza sapply() e data.frame() per cercare e sostituire automaticamente i valori mancanti con media/mediana | Codice breve e veloce | Non conosco i valori di imputazione |



