Per illustrare il tema, che è strettamente collegato all'ordinamento dei dati [1], vediamo tre cose:
→ come individuare i dati mancanti;
→ come i dati mancanti - identificati in R con la sigla NA (Not Available) - possono bloccare l'esecuzione di calcoli sulle variabili numeriche che li contengono e come in questo caso sia possibile omettere selettivamente dai calcoli i dati NA;
→ come al bisogno sia possibile eliminare per intero da un vettore o matrice o tabella [2] i casi con dati NA.
Per proseguire dovete, seguendo le istruzioni fornite alla pagina Dati:
→
effettuare
il
download del
file
importa_csv.csv
→ salvare
il file nella cartella
C:\Rdati\
In alternativa copiate le otto righe riportate qui sotto, incollatele in un editor di file di testo aggiungendo un ↵ Invio al termine dell'ultima riga, e salvate il tutto in C:\Rdati\ in un file di testo denominato importa_csv.csv (attenzione: assicuratevi che il file sia effettivamente salvato con l'estensione .csv):
id;sesso;anni;peso_kg;altezza_m
MT;M;69;76;1,78
GF;F;56;63;
MC;F;53;71;1,60
SB;M;28;73;1,78
FE;F;61;54;1,54
AB;M;46;92;1,84
RF;F;31;81;1,56
Vediamo come individuare i dati mancanti. Copiate e incollate nella Console di R questo script e premete ↵ Invio:
# IDENTIFICA E CONTEGGIA I DATI MANCANTI
#
# importa i dati, notare / invece di \ su windows
mydata <- read.table("C:/Rdati/importa_csv.csv", header=TRUE, sep=";", dec=",", row.names="id")
#
mydata # mostra i dati importati
#
is.na(mydata) # identifica i dati mancanti
#
colSums(is.na(mydata)) # conteggia i dati mancanti per colonna/variabile
#
which(is.na(mydata$altezza_m)) # identifica la posizione dei dati mancanti
#
Dopo avere importato i dati, richiamando il nome dell'oggetto mydata che li contiene questi sono mostrati con la sigla NA riportata automaticamente da R in corrispondenza di ciascuno dei dati mancanti.
> mydata # mostra i dati importati
sesso anni peso_kg altezza_m
MT M 69 76 1.78
GF F 56 63 NA
MC F 53 71 1.60
SB M 28 73 1.78
FE F 61 54 1.54
AB M 46 92 1.84
RF F 31 81 1.56
Nel caso di piccole tabelle come questa non serve altro: ma nel caso di estesi database ci servono funzioni che forniscano qualche soluzione più pratica e immediata.
Impieghiamo quindi la funzione is.na() che identifica nella tabella mydata i dati mancanti riportando TRUE in corrispondenza di ciascuno di essi
> is.na(mydata) # identifica i dati mancanti
sesso anni peso_kg altezza_m
MT FALSE FALSE FALSE FALSE
GF FALSE FALSE FALSE TRUE
MC FALSE FALSE FALSE FALSE
SB FALSE FALSE FALSE FALSE
FE FALSE FALSE FALSE FALSE
AB FALSE FALSE FALSE FALSE
RF FALSE FALSE FALSE FALSE
I dati della tabella mydata trasformati nei corrispettivi valori logici con la funzione is.na() possono allora essere impiegati come argomento della funzione colSums() che effettua il conteggio dei dati mancanti per ciascuna colonna/variabile
colSums(is.na(mydata)) # conteggia i dati mancanti per colonna/variabile
sesso anni peso_kg altezza_m
0 0 0 1
A questo punto abbiamo individuato in altezza_m la variabile con i dati mancanti e abbiamo conteggiato il loro numero.
Non ci resta quindi che impiegare i dati della variabile mydata$altezza_m trasformati nei corrispettivi valori logici con is.na() come argomento della funzione which() per identificare la posizione dei dati mancanti
> which(is.na(mydata$altezza_m)) # identifica la posizione dei dati mancanti
[1] 2
che nel nostro caso risultano essere il dato della riga numero 2 della variabile mydata$altezza_m.
Per l'effetto che i dati mancanti possono determinare sui calcoli copiate
e incollate nella
Console
di R
questo
script
e
premete
↵
Invio:
#
ESEMPIO DI MEDIA ARITMETICA NON COMPUTABILE A CAUSA DI DATI MANCANTI
#
#
importa i dati, notare
/ invece di \ su windows
mydata
<- read.table("C:/Rdati/importa_csv.csv", header=TRUE,
sep=";", dec=",", row.names="id")
#
mydata
# mostra i dati importati
#
mean(mydata$peso_kg)
# calcola la media aritmetica dei valori di peso
mean(mydata$altezza_m)
# calcola la media aritmetica dei valori di altezza
#
Il
risultato che compare nella
Console di R è il seguente:
> mydata # mostra i dati importati
sesso anni peso_kg altezza_m
MT M 69 76 1.78
GF F 56 63 NA
MC F 53 71 1.60
SB M 28 73 1.78
FE F 61 54 1.54
AB M 46 92 1.84
RF F 31 81 1.56
> #
> mean(mydata$peso_kg) # calcola la media aritmetica dei valori di peso
[1] 72.85714
> mean(mydata$altezza_m) # calcola la media aritmetica dei valori di altezza
[1] NA
Come
potete vedere il calcolo della media effettuato con la funzione
mean()
ha avuto successo solamente per il peso. Per l'altezza in luogo del
valore della media è stata riportata la sigla
NA,
evidente
conseguenza del valore mancante dell'altezza nel caso GF.
Copiate e incollate nella
Console
di R
queste due ulteriori righe di codice e premete
↵
Invio:
#
la corretta gestione dei dati mancanti consente di calcolare la media
dei valori di altezza
#
mean(mydata$peso_kg)
#
ricalcola la media aritmetica dei valori di peso
mean(mydata$altezza_m,
na.rm=TRUE)
# ricalcola la media aritmetica dei valori di altezza
#
Il
risultato dei calcoli della media che compare nella
Console di R ora è questo:
> mean(mydata$peso_kg) # ricalcola la media aritmetica dei valori di peso
[1] 72.85714
> mean(mydata$altezza_m, na.rm=TRUE) # ricalcola la media aritmetica dei valori di altezza
[1] 1.683333
Quindi
con l'aggiunta nella funzione mean()
dell'argomento na.rm=TRUE, che rimuove dal calcolo i dati mancanti (in questo caso uno solo, ma potrebbero essere anche molti), è stato reso possibile il calcolo della
media anche per l'altezza.
Con
la funzione na.omit()
è infine possibile eliminare definitivamente i casi con dati
mancanti: anche un solo dato mancante/campo vuoto comporta la
cancellazione dell'intera riga/caso. Copiate e incollate nella Console di R questo script e premete ↵ Invio:
#
ELIMINA I CASI CON DATI MANCANTI
#
#
importa i dati, notare / invece di \ su windows
mydata
<- read.table("C:/Rdati/importa_csv.csv", header=TRUE,
sep=";", dec=",", row.names="id")
#
mydata
# mostra i dati importati
#
newdata
<- na.omit(mydata) # elimina da mydata i casi con dati mancanti
newdata
# mostra i dati dopo eliminazione dei casi con dati mancanti
#
mean(newdata$peso_kg)
# calcola la media aritmetica dei valori di peso
mean(newdata$altezza_m)
# calcola la media aritmetica dei valori di altezza
#
Dai
dati importati nella tabella mydata
mediante la funzione na.omit()
viene generata una nuova tabella denominata newdata
dalla quale sono esclusi i casi con dati mancanti. Con l'eliminazione dalla tabella del caso GF i calcoli vanno subito a buon fine sia per il peso sia per l'altezza.
> mydata # mostra i dati importati
sesso anni peso_kg altezza_m
MT M 69 76 1.78
GF F 56 63 NA
MC F 53 71 1.60
SB M 28 73 1.78
FE F 61 54 1.54
AB M 46 92 1.84
RF F 31 81 1.56
> #
> newdata <- na.omit(mydata) # elimina da mydata i casi con dati mancanti
> newdata # mostra i dati dopo eliminazione dei casi con dati mancanti
sesso anni peso_kg altezza_m
MT M 69 76 1.78
MC F 53 71 1.60
SB M 28 73 1.78
FE F 61 54 1.54
AB M 46 92 1.84
RF F 31 81 1.56
> #
> mean(newdata$peso_kg) # calcola la media aritmetica dei valori di peso
[1] 74.5
> mean(newdata$altezza_m) # calcola la media aritmetica dei valori di altezza
[1] 1.683333
Da
notare che impiegando la funzione na.omit()
la media dei valori di peso, che con lo script precedente era 72.85714 kg,
ora è cambiata ed è diventata 74.5 kg in quanto in seguito all'eliminazione dell'intero caso GF
è stato eliminato anche il suo valore di peso 63 kg che contribuiva a determinare la media di quest'ultimo.
----------
[1] Vedere il post Ordinamento dei dati.
[2] Parliamo di array o vettore nel caso di dati numerici monodimensionali, disposti su una sola riga,
8 | 6 | 11 | 7 |
di matrice nel caso di dati numerici disposti su più righe e più colonne
8 | 9 | 15 | 14 |
6 | 7 | 18 | 12 |
11 | 8 | 17 | 13 |
7 | 4 | 19 | 17 |
e di tabella nei casi in cui il contenuto, disposto su più righe e più colonne, è rappresentato oltre che da dati numerici, anche da testo e/o operatori logici
M | 7 | 9 | VERO |
F | 3 | 12 | VERO |
F | 5 | 10 | FALSO |
Nessun commento:
Posta un commento