R Language
Valori mancanti
Ricerca…
introduzione
Quando non conosciamo il valore che assume una variabile, diciamo che il suo valore è mancante, indicato da NA
.
Osservazioni
I valori mancanti sono rappresentati dal simbolo NA
(non disponibile). I valori impossibili (ad esempio, come risultato di sqrt(-1)
) sono rappresentati dal simbolo NaN
(non un numero).
Esaminando i dati mancanti
anyNA
segnala se sono presenti valori mancanti; mentre is.na
riporta i valori mancanti elementwise:
vec <- c(1, 2, 3, NA, 5)
anyNA(vec)
# [1] TRUE
is.na(vec)
# [1] FALSE FALSE FALSE TRUE FALSE
ìs.na
restituisce un vettore logico che viene convertito in valori interi sotto operazioni aritmetiche (con FALSE = 0, TRUE = 1). Possiamo usarlo per scoprire quanti valori mancanti ci sono:
sum(is.na(vec))
# [1] 1
Estendendo questo approccio, possiamo usare colSums
e is.na
su un frame di dati per contare le NA per colonna:
colSums(is.na(airquality))
# Ozone Solar.R Wind Temp Month Day
# 37 7 0 0 0 0
Il pacchetto naniar (attualmente su github ma non su CRAN) offre ulteriori strumenti per esplorare i valori mancanti.
Lettura e scrittura di dati con valori NA
Quando legge i set di dati tabulari con le funzioni read.*
, R cerca automaticamente i valori mancanti che assomigliano a "NA"
. Tuttavia, i valori mancanti non sono sempre rappresentati da NA
. A volte un punto ( .
), Un trattino ( -
) o un valore di carattere (es .: empty
) indica che un valore è NA
. Il parametro na.strings
della funzione read.*
Può essere usato per indicare a R quali simboli / caratteri devono essere trattati come valori NA
:
read.csv("name_of_csv_file.csv", na.strings = "-")
È anche possibile indicare che più di un simbolo deve essere letto come NA
:
read.csv('missing.csv', na.strings = c('.','-'))
Allo stesso modo, NA
s può essere scritto con stringhe personalizzate usando l'argomento na
per write.csv
. Altri strumenti per leggere e scrivere tabelle hanno opzioni simili.
Uso di NA di classi diverse
Il simbolo NA
è per un valore mancante logical
:
class(NA)
#[1] "logical"
Questo è conveniente, poiché può essere facilmente forzato ad altri tipi di vettori atomici, ed è quindi solitamente l'unico NA
cui avrai bisogno:
x <- c(1, NA, 1)
class(x[2])
#[1] "numeric"
Se hai bisogno di un singolo valore NA
di un altro tipo, usa NA_character_
, NA_integer_
, NA_real_
o NA_complex_
. Per i valori mancanti delle classi di fantasia, la NA_integer_
con NA_integer_
solito funziona; ad esempio, per ottenere una data con valore mancante:
class(Sys.Date()[NA_integer_])
# [1] "Date"
VERO / FALSO e / o NA
NA
è un tipo logico e un operatore logico con una NA
restituirà NA
se il risultato è ambiguo. Sotto, NA OR TRUE
risulta TRUE
perché almeno una parte valuta TRUE
, tuttavia NA OR FALSE
restituiscono NA
perché non sappiamo se NA
sarebbe stata TRUE
o FALSE
NA | TRUE
# [1] TRUE
# TRUE | TRUE is TRUE and FALSE | TRUE is also TRUE.
NA | FALSE
# [1] NA
# TRUE | FALSE is TRUE but FALSE | FALSE is FALSE.
NA & TRUE
# [1] NA
# TRUE & TRUE is TRUE but FALSE & TRUE is FALSE.
NA & FALSE
# [1] FALSE
# TRUE & FALSE is FALSE and FALSE & FALSE is also FALSE.
Queste proprietà sono utili se si desidera impostare un set di dati basato su alcune colonne che contengono NA
.
df <- data.frame(v1=0:9,
v2=c(rep(1:2, each=4), NA, NA),
v3=c(NA, letters[2:10]))
df[df$v2 == 1 & !is.na(df$v2), ]
# v1 v2 v3
#1 0 1 <NA>
#2 1 1 b
#3 2 1 c
#4 3 1 d
df[df$v2 == 1, ]
v1 v2 v3
#1 0 1 <NA>
#2 1 1 b
#3 2 1 c
#4 3 1 d
#NA NA NA <NA>
#NA.1 NA NA <NA>
Omissione o sostituzione dei valori mancanti
Ricodifica valori mancanti
Regolarmente, i dati mancanti non sono codificati come NA
nei set di dati. Ad esempio, in SPSS i valori mancanti sono spesso rappresentati dal valore 99
.
num.vec <- c(1, 2, 3, 99, 5)
num.vec
## [1] 1 2 3 99 5
È possibile assegnare direttamente NA usando il subsetting
num.vec[num.vec == 99] <- NA
Tuttavia, il metodo preferito è usare is.na<-
come sotto. Il file della guida ( ?is.na
) afferma:
is.na<-
può fornire un modo più sicuro per impostare la mancanza. Si comporta in modo diverso per fattori, ad esempio.
is.na(num.vec) <- num.vec == 99
Entrambi i metodi ritornano
num.vec
## [1] 1 2 3 NA 5
Rimozione dei valori mancanti
I valori mancanti possono essere rimossi in diversi modi da un vettore:
num.vec[!is.na(num.vec)]
num.vec[complete.cases(num.vec)]
na.omit(num.vec)
## [1] 1 2 3 5
Escludendo i valori mancanti dai calcoli
Quando si utilizzano funzioni aritmetiche su vettori con valori mancanti, verrà restituito un valore mancante:
mean(num.vec) # returns: [1] NA
Il parametro na.rm
indica alla funzione di escludere i valori NA
dal calcolo:
mean(num.vec, na.rm = TRUE) # returns: [1] 2.75
# an alternative to using 'na.rm = TRUE':
mean(num.vec[!is.na(num.vec)]) # returns: [1] 2.75
Alcune funzioni R, come lm
, hanno un parametro na.action
. Il valore predefinito per questo è na.omit
, ma con le options(na.action = 'na.exclude')
il comportamento predefinito di R può essere modificato.
Se non è necessario modificare il comportamento predefinito, ma per una situazione specifica è necessario un altro na.action
, il parametro na.action
deve essere incluso nella chiamata alla funzione, ad esempio:
lm(y2 ~ y1, data = anscombe, na.action = 'na.exclude')