7.2 Trattamento dei dati mancanti

Se una variabile contiene valori mancanti, R non è in grado di applicare ad essa alcune Funzioni, come ad esempio la media. Per questa ragione, la gran parte delle funzioni di R prevedono modi specifici per trattare i valori mancanti.

Ci sono diversi tipi di dati “mancanti” in R;

  • NA - generico dato mancante;
  • NaN - il codice NaN (Not a Number) indica i valori numerici impossibili, quali ad esempio un valore 0/0;
  • Inf e -Inf - Infinity, si verifca, ad esempio, quando si divide un numero per 0.

La funzione is.na() ritorna un output che indica con TRUE le celle che contengono NA o NaN.

Si noti che

  • se is.na(x) è TRUE, allora !is.na(x) è FALSE;
  • all(!is.na(x)) ritorna TRUE se tutti i valori x sono NOT NA;
  • any(is.na(x)) risponde alla domanda: c’è qualche valore NA (almeno uno) in x?;
  • complete.cases(x) ritorna TRUE se ciascun elemento di x è is NOT NA; ritorna FALSE se almeno un elemento di x è NA;

Le funzioni R is.nan() e is.infinite() si applicano ai tipi di dati NaN e Inf.

Per esempio, consideriamo il seguente data.frame:

d <- tibble(
  w = c(1, 2, NA, 3, NA),
  x = 1:5,
  y = 1,
  z = x^2 + y,
  q = c(3, NA, 5, 1, 4)
)
d
#> # A tibble: 5 × 5
#>       w     x     y     z     q
#>   <dbl> <int> <dbl> <dbl> <dbl>
#> 1     1     1     1     2     3
#> 2     2     2     1     5    NA
#> 3    NA     3     1    10     5
#> 4     3     4     1    17     1
#> 5    NA     5     1    26     4
is.na(d$w)
#> [1] FALSE FALSE  TRUE FALSE  TRUE
is.na(d$x)
#> [1] FALSE FALSE FALSE FALSE FALSE

Per creare un nuovo Dataframe senza valori mancanti:

d_clean <- d[complete.cases(d), ]
d_clean
#> # A tibble: 2 × 5
#>       w     x     y     z     q
#>   <dbl> <int> <dbl> <dbl> <dbl>
#> 1     1     1     1     2     3
#> 2     3     4     1    17     1

Oppure, se vogliamo eliminare le righe con NA solo in una variabile:

d1 <- d[!is.na(d$q), ]
d1
#> # A tibble: 4 × 5
#>       w     x     y     z     q
#>   <dbl> <int> <dbl> <dbl> <dbl>
#> 1     1     1     1     2     3
#> 2    NA     3     1    10     5
#> 3     3     4     1    17     1
#> 4    NA     5     1    26     4

Se vogliamo esaminare le righe con i dati mancanti in qualunque colonna:

d_na <- d[!complete.cases(d), ]
d_na
#> # A tibble: 3 × 5
#>       w     x     y     z     q
#>   <dbl> <int> <dbl> <dbl> <dbl>
#> 1     2     2     1     5    NA
#> 2    NA     3     1    10     5
#> 3    NA     5     1    26     4

Spesso i valori mancanti vengono sostiuti con valori “ragionevoli”, come ad esempio la media dei valori in quella colonna del Dataframe. Oppure, vengono considerati come “ragionevoli” i valori che vengono predetti conoscendo le altre variabili del Dataframe. Questa procedura si chiama imputazione multipla. Questo è però un argomento avanzato che non verrà trattato in questo insegnamento. La cosa più semplice da fare, in presenza di dati mancanti, è semplicemente quella di escludere tutte le righe nelle quali ci sono degli NAs.