2014-06-11 22 views
37

Ecco lo link dei miei dati.Modificare le celle vuote su "NA"

Il mio obiettivo è assegnare "NA" a tutte le celle vuote indipendentemente dai valori categoriali o numerici. Sto usando na.strings = "". Ma non sta assegnando NA a tutte le celle vuote.

## reading the data 
dat <- read.csv("data2.csv") 
head(dat) 
    mon hr  acc alc sex spd axles door reg         cond1 drug1 
1 8 21 No Control TRUE F 0  2 2  Physical Impairment (Eyes, Ear, Limb)  A 
2 7 20 No Control FALSE M 900  2 2        Inattentive  D 
3 3 9 No Control FALSE F 100  2 2 2004        Normal  D 
4 1 15 No Control FALSE M 0  2 2  Physical Impairment (Eyes, Ear, Limb)  D 
5 4 21 No Control FALSE  25 NA NA            D 
6 4 20 No Control NA F 30  2 4    Drinking Alcohol - Impaired  D 
     inj1 PED_STATE st rac1 
1  Fatal  <NA> F <NA> 
2 Moderate  <NA> F <NA> 
3 Moderate  <NA> M <NA> 
4 Complaint  <NA> M <NA> 
5 Complaint  <NA> F <NA> 
6 Moderate  <NA> M <NA> 


## using na.strings 
dat2 <- read.csv("data2.csv", header=T, na.strings="") 
head(dat2) 
    mon hr  acc alc sex spd axles door reg         cond1 drug1 
1 8 21 No Control TRUE F 0  2 2 <NA> Physical Impairment (Eyes, Ear, Limb)  A 
2 7 20 No Control FALSE M 900  2 2 <NA>       Inattentive  D 
3 3 9 No Control FALSE F 100  2 2 2004        Normal  D 
4 1 15 No Control FALSE M 0  2 2 <NA> Physical Impairment (Eyes, Ear, Limb)  D 
5 4 21 No Control FALSE  25 NA NA <NA>         <NA>  D 
6 4 20 No Control NA F 30  2 4 <NA>   Drinking Alcohol - Impaired  D 
     inj1 PED_STATE st rac1 
1  Fatal  NA F NA 
2 Moderate  NA F NA 
3 Moderate  NA M NA 
4 Complaint  NA M NA 
5 Complaint  NA F NA 
6 Moderate  NA M NA 

risposta

48

Suppongo che tu stia parlando della colonna 5 "sesso". Potrebbe essere il caso che nel file data2.csv la cella contenga uno spazio e quindi non sia considerata vuota da R.

Inoltre, ho notato che nella riga 5 colonne "assi" e "porta", l'originale i valori letti da data2.csv sono string "NA". Probabilmente vorrai trattare anche quelli come na.strings. Per fare questo,

dat2 <- read.csv("data2.csv", header=T, na.strings=c("","NA")) 

EDIT:

Ho scaricato il vostro data2.csv. Sì, c'è uno spazio nella colonna 5 "sesso". Così si vuole

na.strings=c(""," ","NA") 
21

È possibile utilizzare gsub per sostituire mutazioni multiple di vuoto, come "" o uno spazio, per essere NA:

data= data.frame(cats=c('', ' ', 'meow'), dogs=c("woof", " ", NA)) 
apply(data, 2, function(x) gsub("^$|^ $", NA, x)) 
7

Una soluzione più eye-friendly utilizzando dplyr sarebbe

require(dplyr) 

## fake some NA 
iris[1,1]="" 

## define a helper function 
empty_as_na <- function(x){ 
    if("factor" %in% class(x)) x <- as.character(x) ## since ifelse wont work with factors 
    ifelse(as.character(x)!="", x, NA) 
} 

## transform all columns 
iris %>% mutate_each(funs(empty_as_na)) 

Per applicare la correzione a un solo sottoinsieme di colonne è possibile specificare le colonne di interesse utilizzando la sintassi di corrispondenza delle colonne di dplyr. Esempio: mutate_each(funs(empty_as_na), matches("Width"), Species)

Nel caso in cui tabella contiene le date si consiglia di utilizzare una versione di more typesafeifelse

+6

Come si aggiunge una nuova libreria, la creazione di una nuova funzione è più * eye-friendly *? E penso che avrai bisogno di 'ifelse (x% in% c (" "," "," NA "), NA, x)'. – zx8754

+2

L'uso di una funzione insieme a 'mutate_each' offre maggiore flessibilità e un modello riutilizzabile. 'dplyr' è onnipresente nei flussi di lavoro di oggi ed è stato appena aggiunto per rendere la risposta autonoma. Penso che 'x! =" "' Sia corretto qui, poiché né "" né "NA" sono vuoti. Inoltre la risposta di @sclarky fallisce per i frame di dati contenenti numeri e @ Badoe non risolve il problema per i dataframes esistenti, quindi nessuna altra risposta sembra rispondere alla domanda in modo generico. Sono felice di conoscere soluzioni migliori. –

+1

* dplyr è onnipresente nei flussi di lavoro di oggi R - no no.E che cosa "* e @ Badoe's non risolvono veramente il problema per i data.frames * esistenti" significa anche? Puoi espandere un po 'questa affermazione? –

4

Recentemente mi sono imbattuto in problemi simili. Questo è ciò che ha funzionato per me, se la variabile è numerica, allora un semplice df$Var[df$Var == ""] <- "NA" dovrebbe essere sufficiente. Ma se la variabile è un fattore, devi prima convertirlo in carattere, quindi sostituire le celle "" con il valore desiderato e convertirlo in fattore. Quindi, caso in questione, la variabile sesso, suppongo che sarebbe stato un fattore e se si desidera sostituire la cella vuota, vorrei fare quanto segue:

df$Var <- as.character(df$Var) 
df$Var[df$Var==""] <- "NA" 
df$Var <- as.factor(df$Var) 
0

Non potresti semplicemente usare

dat <- read.csv("data2.csv",na.strings=" ",header=TRUE) 

dovrebbe convertire tutti gli spazi in NA come i dati vengono letti in assicurati di inserire uno spazio tra la tua quotazione

+2

Questo è suggerito da Badoe nella risposta accettata. – Gregor

Problemi correlati