2013-10-21 11 views
47

Avendo un frame di dati, come faccio a sostituire tutti i valori particolari lungo tutte le righe e le colonne. Diciamo per esempio voglio sostituire tutti i record vuoti con NA 's (senza digitare le posizioni):Sostituisci tutti i valori particolari in un frame di dati

df <- data.frame(list(A=c("", "xyz", "jkl"), B=c(12, "", 100))) 

    A B 
1  12 
2 xyz  
3 jkl 100 

Risultato atteso:

A B 
1 NA 12 
2 xyz NA 
3 jkl 100 

risposta

70

Ti piace questa:

> df[df==""]<-NA 
> df 
    A B 
1 <NA> 12 
2 xyz <NA> 
3 jkl 100 
+10

c'è un modo per fare questo in modo efficace per più di 1 valore !? – PikkuKatja

+10

Questo non funziona per i fattori, 'df [df ==" xyz "] <-" abc "' errore con "livello di fattore non valido". C'è una soluzione più generale? – glallen

+0

non funziona per me. Ho provato questo: dfSmallDiscreteCustomSalary [dfSmallDiscreteCustomSalary $ salary == "<= 50K"] <- "49K". Ancora per unique (dfSmallDiscreteCustomSalary $ salario) ottengo: [1]> 50K <= 50K –

19

Dal PikkuKatja e glallen ha chiesto una soluzione più generale e non posso ancora commentare, scriverò una risposta. È possibile combinare le dichiarazioni come:

> df[df=="" | df==12] <- NA 
> df 
    A B 
1 <NA> <NA> 
2 xyz <NA> 
3 jkl 100 

Per i fattori, il codice di zxzak produce già fattori:

> df <- data.frame(list(A=c("","xyz","jkl"), B=c(12,"",100))) 
> str(df) 
'data.frame': 3 obs. of 2 variables: 
$ A: Factor w/ 3 levels "","jkl","xyz": 1 3 2 
$ B: Factor w/ 3 levels "","100","12": 3 1 2 

Se nei guai, io suggerirei di abbandonare temporaneamente i fattori.

df[] <- lapply(df, as.character) 
2

Possiamo usare data.table per farlo rapidamente. Innanzitutto creare df senza fattori,

df <- data.frame(list(A=c("","xyz","jkl"), B=c(12,"",100)), stringsAsFactors=F) 

Ora è possibile utilizzare

setDT(df) 
for (jj in 1:ncol(df)) set(df, i = which(df[[jj]]==""), j = jj, v = NA) 

ed è possibile riconvertirlo in un data.frame

setDF(df) 

Se si desidera utilizzare solo i dati .frame e mantenere i fattori è più difficile, è necessario lavorare con

levels(df$value)[levels(df$value)==""] <- NA 

dove valore è il nome di ogni colonna. È necessario inserirlo in un ciclo.

+2

Perché dovresti utilizzare una libreria esterna per questo caso d'uso? Perché un ciclo se questo può essere risolto con una linea? In che modo la tua risposta aggiunge valore oltre alle risposte già presenti? Non intendo essere duro, penso che mi manchi qualcosa, quindi le domande. – sedot

+1

È molto più veloce per dataset di grandi dimensioni. Aggiunge un'alternativa in modo che l'utente possa scegliere il meglio per lui. – skan

0

Se si desidera sostituire più valori in un frame di dati, è possibile eseguire il loop di tutte le colonne.

dire che si desidera sostituire "" e 100:

na_codes <- c(100, "") 
for (i in seq_along(df)) { 
    df[[i]][df[[i]] %in% na_codes] <- NA 
} 
Problemi correlati