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')


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow