Sottoinsieme di righe contenenti valori NA (mancanti) in una colonna scelta di un frame di dati

Abbiamo una cornice dati da un file CSV. Il frame di dati DF contiene colonne che contengono valori osservati e una colonna ( VaR2 ) che contiene la data in cui è stata eseguita una misurazione. Se la data non è stata registrata, il file CSV contiene il valore NA , per i dati mancanti.

 Var1 Var2 10 2010/01/01 20 NA 30 2010/03/01 

Vorremmo utilizzare il comando subset per definire un nuovo frame di dati new_DF tale che contenga solo le righe che hanno un valore NA' dalla colonna ( VaR2 ). Nell’esempio fornito, solo la riga 2 sarà contenuta nel nuovo DF .

Il comando

 new_DF<-subset(DF,DF$Var2=="NA") 

non funziona, la cornice dati risultante non ha voci di riga.

Se nel file CSV originale il Valore NA viene scambiato con NULL , lo stesso comando produce il risultato desiderato: new_DF<-subset(DF,DF$Var2=="NULL") .

Come posso far funzionare questo metodo, se per la stringa di caratteri viene fornito il valore NA nel file CSV originale?

Non utilizzare mai == ‘NA’ per verificare i valori mancanti. Usa invece is.na() . Questo dovrebbe farlo:

 new_DF <- DF[rowSums(is.na(DF)) > 0,] 

o nel caso in cui desideri controllare una particolare colonna, puoi anche usarla

 new_DF <- DF[is.na(DF$Var),] 

Nel caso in cui tu abbia valori di carattere NA, prima prova

 Df[Df=='NA'] <- NA 

per sostituirli con valori mancanti.

NA è un valore speciale in R, non confondere il valore NA con la stringa “NA”. A seconda del modo in cui i dati sono stati importati, le celle “NA” e “NULL” possono essere di vario tipo (il comportamento predefinito è convertire stringhe “NA” in valori NA e lasciare che le stringhe “NULL” siano).

Se si utilizza read.table () o read.csv (), si dovrebbe prendere in considerazione l’argomento “na.strings” per eseguire l’importazione pulita dei dati e lavorare sempre con valori R NA reali.

Un esempio, lavorando in entrambi i casi “NULL” e “NA”:

 DF <- read.csv("file.csv", na.strings=c("NA", "NULL")) new_DF <- subset(DF, is.na(DF$Var2)) 

complete.cases restituisce TRUE quando tutti i valori di una riga non sono NA

 DF[!complete.cases(DF), ] 

Prova a cambiare questo:

 new_DF<-dplyr::filter(DF,is.na(Var2)) 
 new_data <- data %>% filter_all(any_vars(is.na(.))) 

Questo dovrebbe creare un nuovo frame di dati ( new_data ) con solo i valori mancanti in esso.

Funziona meglio per mantenere una traccia dei valori che potresti successivamente eliminare perché avevano alcune colonne con le osservazioni mancanti (NA).

Stampa tutte le righe con i dati NA:

 tmp <- data.frame(c(1,2,3),c(4,NA,5)); tmp[round(which(is.na(tmp))/ncol(tmp)),]