Vai al contenuto principale

Come usare na.rm per gestire i valori mancanti in R

Impostiamo na.rm = TRUE nelle funzioni R più comuni per escludere i valori mancanti (NA). Questo ci aiuta a calcolare statistiche accurate e migliora l’affidabilità dei risultati.
· 8 min leggi

Scopri con l'IA

I dati vengono generati e consumati a ritmo industriale per guidare decisioni aziendali chiave. Tuttavia, una sfida comune nell’analisi dei dati è la presenza di valori mancanti. Questo può alterare i risultati, rendendo inevitabile per qualsiasi data analyst gestirli in modo efficace. In R, uno degli strumenti fondamentali per gestire i valori mancanti è il parametro na.rm.

Questo post spiega l’importanza di gestire i dati mancanti, come funziona na.rm in R, ne mostra l’uso in varie funzioni e conclude illustrando alcune tecniche alternative per identificare e gestire i valori mancanti.

La risposta breve: cos’è na.rm?

Il parametro na.rm in R sta per "NA remove" e ignora i valori NA (mancanti) durante i calcoli. Impostando na.rm = TRUE, funzioni come mean(), sum(), min(), max(), median() e sd() calcolano i risultati senza essere influenzate dai valori mancanti.

Il parametro na.rm, scritto in minuscolo, accetta un valore booleano—TRUE o FALSE. Quando impostiamo na.rm = TRUE, R esclude i valori NA dai calcoli. Senza questo parametro, le funzioni restituirebbero NA se nel dato sono presenti valori mancanti. Guarda qui.

vector_with_na <- c(1, 2, NA)

sum(vector_with_na, na.rm = TRUE) # removes NA values — returns 3
sum(vector_with_na) # includes NA values — returns NA
sum(vector_with_na, na.rm = FALSE) # includes NA values — returns NA

Dai un’occhiata al corso Introduction to R per approfondire le basi della programmazione in R.

Perché usare na.rm?

Gestire i valori mancanti è fondamentale nell’analisi dei dati per garantire risultati accurati, poiché possono influenzare in modo significativo i calcoli statistici e portare inavvertitamente a conclusioni errate. Usare na.rm rende pratico evitare errori saltando questi valori mancanti, eseguendo così calcoli affidabili e mantenendo l’integrità dei dati.

Il corso Data Cleaning in R è prezioso per far progredire le nostre competenze di analisi dei dati.

Funzioni comuni che usano na.rm: alcuni esempi pratici

Ora vediamo come usare na.rm in R. Diverse funzioni di R includono il parametro na.rm (impostato su FALSE per impostazione predefinita). Ecco alcuni esempi comuni:

sum()

Come suggerisce il nome, sum() calcola il totale dei valori in un vettore. Creiamo un vettore chiamato vector_with_na, che useremo per tutto il tutorial.

vector_with_na <- c(1, 2, NA, 4)

sum(vector_with_na) 
# Returns NA

sum(vector_with_na, na.rm = TRUE) 
# Returns 7

mean()

Usando lo stesso esempio, la funzione mean() calcola la media, ossia la media aritmetica dei valori nel nostro vettore.

mean(vector_with_na) 
# Returns NA

mean(vector_with_na, na.rm = TRUE) 
# Returns 2.33

sd()

Continuando con vector_with_na, sd() calcola la deviazione standard del vettore.

sd(vector_with_na) 
# Returns NA

sd(vector_with_na, na.rm = TRUE) 
# Returns 1.53

min()

min() trova il valore minimo.

min(vector_with_na) 
# Returns NA

min(vector_with_na, na.rm = TRUE) 
# Returns 1

max()

max() trova il valore massimo.

max(vector_with_na) 
# Returns NA

max(vector_with_na, na.rm = TRUE) 
# Returns 4

median()

median() trova il valore centrale una volta ordinati i dati.

median(vector_with_na) 
# Returns NA

median(vector_with_na, na.rm = TRUE) 
# Returns 2

Nota che in assenza di na.rm = TRUE tutte queste funzioni di aggregazione restituiscono NA.

Impostando na.rm = TRUE, queste funzioni escludono i valori NA, portando a calcoli accurati e significativi. Il percorso di competenze R Programming Fundamentals può essere una buona risorsa per comprendere meglio l’uso e la sintassi di queste funzioni.

Gestire i valori mancanti in diverse strutture dati

Vediamo come gestire i valori mancanti in diverse strutture dati. Prima di continuare, dai un’occhiata al nostro tutorial Mastering Data Structures in the R Programming Language se vuoi saperne di più sulle strutture dati in R. 

Vettori

Nei vettori, na.rm può essere usato direttamente nelle funzioni per escludere i valori mancanti. Gli esempi della sezione precedente mostrano tutti na.rm in azione sui vettori.

Data frame

Per i data frame, na.rm può essere applicato all’interno delle funzioni usate su colonne specifiche o sulle righe usando apply() come mostrato di seguito:

apply(X, MARGIN, FUN)

Qui:

  • X: un array, data frame o matrice

  • MARGIN: argomento per identificare dove applicare la funzione:

    • MARGIN=1 per operare sulle righe

    • MARGIN=2 per operare sulle colonne

    • MARGIN=c(1,2) per operare sia su righe che su colonne

  • FUN: indica quale funzione applicare. Possono essere applicate funzioni integrate come mean(), median(), sum(), min(), max() e funzioni definite dall’utente.

Creiamo un data frame che useremo come riferimento per tutto il tutorial.

dataframe_with_na <- data.frame(col1 = c(1, NA, 3, 6), col2 = c(4, 5, NA, 7))

print(dataframe_with_na)
# Returns
#   col1 col2
# 1    1    4
# 2   NA    5
# 3    3   NA
# 4    6    7

apply(dataframe_with_na, 1, mean)
# Returns
# [1] 2.5  NA  NA 6.5

apply(dataframe_with_na, 1, mean, na.rm = TRUE)
# Returns
# [1] 2.5 5.0 3.0 6.5

apply(dataframe_with_na, 2, mean)
# Returns
# col1 col2 
#  NA   NA 

apply(dataframe_with_na, 2, mean, na.rm = TRUE)
# Returns   
#   col1     col2 
# 3.333333 5.333333

Liste

La funzione lapply() in R viene usata per applicare una funzione specifica a ciascun elemento di una lista, vettore o data frame e restituisce una lista della stessa lunghezza. Questa funzione non richiede un parametro MARGIN, poiché applica automaticamente l’operazione a tutti gli elementi.

Sintassi:

lapply(vector_with_na, fun)

Qui:

  • vector_with_na: La lista, il vettore o il data frame di input.
  • fun: La funzione da applicare a ciascun elemento dell’input.

Comprendiamo lapply() con un esempio su una lista. Qui abbiamo una lista di collezioni (item_1 e item_2) con elementi simili al data frame (dataframe_with_na). L’obiettivo è trovare la media di ciascuna collezione.

list_with_na <- list(item_1=c(1, NA, 3, 6), item_2=c(4, 5, NA, 7))

lapply(list_with_na, mean)
# Returns
# $item_1
# [1] NA
# 
# $item_2
# [1] NA

lapply(list_with_na, mean, na.rm =TRUE)
# Returns
# $item_1
# [1] 3.333333
# 
# $item_2
# [1] 5.333333

La funzione sapply() è simile a lapply() ma restituisce un array o una matrice invece di una lista. Usiamo la lista (list_with_na) e sapply() per calcolare la media dei valori di ciascuna collezione al suo interno.

sapply(list_with_na, mean)
# Returns
# a  b 
# NA NA 

sapply(list_with_na, mean, na.rm = TRUE)

# Returns
# a        b 
# 3.333333 5.333333

Ora usiamo il data frame (dataframe_with_na) e sapply() per calcolare la somma dei valori di ciascuna colonna.

sapply(dataframe_with_na, sum)

# Returns
# col1 col2 
# NA   NA 

sapply(dataframe_with_na, sum, na.rm=TRUE)
# Returns
# col1 col2 
# 10   16

Per una comprensione più ampia della manipolazione dei dati in R, il corso Data Manipulation with dplyr è altamente consigliato. Se ti senti insicuro in particolare sulla famiglia di funzioni apply(), leggi il nostro Tutorial on the R Apply Family.

Confronto con na.omit() e complete.cases()

na.omit(): questa funzione rimuove tutte le righe che contengono valori NA in un data frame. Vediamolo con un esempio:

na.omit(dataframe_with_na)
# Returns
# col1 col2
# 1    1    4
# 4    6    7

complete.cases(): invece, complete.cases() identifica le righe senza alcun valore NA e restituisce un booleano corrispondente a ciascuna riga (FALSE per le righe con NA e viceversa). Questo può essere usato per filtrare i valori non mancanti nel data frame, come mostrato sotto.

complete.cases(dataframe_with_na)
# Returns
# [1]  TRUE FALSE FALSE  TRUE

dataframe_with_na[complete.cases(dataframe_with_na), ]
# Returns
# col1 col2
# 1    1    4
# 4    6    7

Tecniche avanzate per gestire i valori mancanti

Oltre a na.rm, R offre metodi avanzati per gestire i dati mancanti:

Usare is.na() per identificare i valori mancanti

is.na() può essere applicata direttamente a un vettore o a un data frame per identificare i dati mancanti. Restituisce TRUE per ciascun valore mancante.

is.na(vector_with_na)
# Returns
# [1] FALSE FALSE  TRUE FALSE

is.na(dataframe_with_na)
# Returns
# col1  col2
# [1,] FALSE FALSE
# [2,]  TRUE FALSE
# [3,] FALSE  TRUE
# [4,] FALSE FALSE

Applicare metodi di imputazione

L’imputazione sostituisce i valori mancanti con valori stimati, come la media o la mediana, come mostrato di seguito:

vector_with_na[is.na(vector_with_na)] <- mean(vector_with_na, na.rm = TRUE)

print(vector_with_na)
# Returns
# [1] 1.000000 2.000000 2.333333 4.000000

dataframe_with_na[is.na(dataframe_with_na)] <- sapply(dataframe_with_na, mean, na.rm=TRUE)
print(dataframe_with_na)
# Returns
# col1     col2
# 1 1.000000 4.000000
# 2 3.333333 5.000000
# 3 3.000000 5.333333
# 4 6.000000 7.000000

Usare la funzione summary()

È interessante notare che la funzione summary() si comporta in modo diverso rispetto all’uso di na.rm nella gestione dei valori mancanti. Per impostazione predefinita, summary() esclude automaticamente i valori mancanti quando calcola le statistiche riassuntive e successivamente riporta il numero di NA presenti nei dati.

Eseguiamo summary() sul vettore vector_with_na:

summary(vector_with_na)
#Returns
#   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
#  1.000   1.500   2.000   2.333   3.000   4.000       1

E sul data frame dataframe_with_na:

summary(dataframe_with_na)
# Returns
# col1           col2     
# Min.   :1.00   Min.   :4.00  
# 1st Qu.:2.50   1st Qu.:4.75  
# Median :3.00   Median :5.00  
# Mean   :3.25   Mean   :5.25  
# 3rd Qu.:3.75   3rd Qu.:5.50  
# Max.   :6.00   Max.   :7.00 

Il corso Intermediate R offre approfondimenti per chi è interessato a tecniche di gestione dei dati più avanzate.

Buone pratiche per gestire i valori mancanti

Gestire efficacemente i valori mancanti comporta diverse buone pratiche:

Controlla sempre la presenza di valori mancanti

Identifica e comprendi l’entità dei dati mancanti prima di eseguire i calcoli. Nell’esempio seguente vediamo che il data frame ha un totale di 2 valori mancanti.

print(dataframe_with_na)
# Returns
# col1 col2
# 1    1    4
# 2   NA    5
# 3    3   NA
# 4    6    7

sum(is.na(dataframe_with_na))
# Returns
# [1] 2

Usa controlli condizionali

Verifica sempre la presenza di dati mancanti e applica di conseguenza eventuali tecniche di imputazione, assicurandoti di gestire bene tutti i casi limite.

if(any(is.na(dataframe_with_na))) {  
  if (class(dataframe_with_na) == "data.frame") {    
   dataframe_with_na[is.na(dataframe_with_na)] <- sapply(dataframe_with_na, median, na.rm=TRUE)      
  }
}

print(dataframe_with_na)
# Returns
# col1 col2
# 1    1    4
# 2    3    5
# 3    3    5
# 4    6    7

Considera il contesto

Comprendi perché i dati sono mancanti e scegli un metodo appropriato per gestirli — rimozione o imputazione.

Per un approccio strutturato all’analisi dei dati e alla gestione dei valori mancanti, il corso Data Cleaning in R può essere una grande risorsa.

Conclusione

Capire e usare na.rm è fondamentale per garantire un’analisi dei dati affidabile e accurata. Esercitati a usare na.rm nei progetti R ed esplora tecniche avanzate per gestire in modo completo i dati mancanti.

Per approfondire, esplora queste risorse aggiuntive:

Vidhi Chugh

Autore

Vidhi Chugh

Sono una stratega ed eticista dell’AI che lavora all’intersezione tra data science, prodotto e ingegneria per creare sistemi di machine learning scalabili. Inserita tra i "Top 200 Business and Technology Innovators" al mondo, ho la missione di democratizzare il machine learning e di eliminare il gergo tecnico affinché tutti possano partecipare a questa trasformazione.

Domande frequenti

Che cos’è il parametro na.rm in R?

Il parametro na.rm in R sta per "NA remove". Quando impostato su TRUE, indica alle funzioni di ignorare i valori NA (mancanti) durante i calcoli, garantendo risultati accurati.

Come si usa na.rm nelle funzioni comuni di R?

Puoi usare na.rm in funzioni come sum(), mean(), sd(), min(), max() e median() impostando na.rm = TRUE per escludere i valori mancanti dai calcoli.

Perché è importante gestire i valori mancanti nell’analisi dei dati?

I valori mancanti possono alterare i risultati e portare a conclusioni inaccurate. Gestirli in modo efficace garantisce calcoli affidabili e mantiene l’integrità dei dati.

Si può usare na.rm con data frame e liste in R?

Sì, na.rm può essere usato con i data frame tramite funzioni come apply(), e con le liste usando lapply() e sapply(), per escludere i valori mancanti durante le operazioni su queste strutture dati.

Quali sono alcune tecniche avanzate per gestire i valori mancanti in R?

Oltre a na.rm, tecniche avanzate includono l’uso di is.na() per identificare i valori mancanti, l’applicazione di metodi di imputazione per sostituirli e l’utilizzo di funzioni come na.omit() e complete.cases() per pulizie dei dati più complesse.

Argomenti

Correlato