2013-10-21 16 views
47

Mit einem Datenrahmen, wie gehe ich zum Ersetzen aller bestimmten Werte in allen Zeilen und Spalten. Sagen Sie zum Beispiel, das ich alle leeren Datensätze mit NA ‚s ersetzen möchten (ohne die Positionen eingeben):Ersetzen Sie alle bestimmten Werte in einem Datenrahmen

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

    A B 
1  12 
2 xyz  
3 jkl 100 

Erwartetes Ergebnis:

A B 
1 NA 12 
2 xyz NA 
3 jkl 100 

Antwort

70

So:

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

ist es eine Möglichkeit, dies für mehr als 1 Wert effizient zu tun !? – PikkuKatja

+10

Dies funktioniert nicht für Faktoren, 'df [df ==" xyz "] <-" abc "' wird Fehler mit "ungültiger Faktor Ebene." Gibt es eine allgemeinere Lösung? – glallen

+0

funktioniert nicht für mich. Ich habe das versucht: dfSmallDiscreteCustomSalary [dfSmallDiscreteCustomSalary $ Gehalt == "<= 50K"] <- "49K". Immer noch für einzigartig (dfSmallDiscreteCustomSalary $ Gehalt) bekomme ich: [1]> 50K <= 50K –

19

Seit PikkuKatja und Glallen hat nach einer allgemeineren Lösung gefragt und ich kann noch nichts sagen, ich werde eine Antwort schreiben. Sie können Aussagen wie in kombinieren:

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

Für Faktoren, zxzak den Code bereits ergibt Faktoren:

> 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 

Wenn in Schwierigkeiten, ich würde vorschlagen, um vorübergehend die Faktoren fallen.

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

Wir können data.table verwenden, um es schnell zu bekommen. Erste df ohne Faktoren erstellen,

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

Jetzt können Sie

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

verwenden und Sie können es zu einem data.frame konvertieren zurück

setDF(df) 

Wenn Sie nur Daten verwenden möchten .frame und halten Faktoren, die es schwieriger ist, müssen Sie mit

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

Dabei ist Wert der Name jeder Spalte. Sie müssen es in eine Schleife einfügen.

+2

Warum würden Sie eine externe Bibliothek für diesen Anwendungsfall verwenden? Warum eine Schleife, wenn dies mit einer Zeile gelöst werden kann? Wie bringt Ihre Antwort einen Mehrwert über die bereits vorhandenen Antworten hinaus? Ich habe nicht die Absicht, hart zu sein, ich denke, ich vermisse etwas, daher die Fragen. – sedot

+1

Es ist viel schneller für große Datensätze. Es fügt eine Alternative hinzu, so dass der Benutzer das Beste für ihn auswählen kann. – skan

0

Wenn Sie mehrere Werte in einem Datenrahmen ersetzen möchten, kann das Durchlaufen aller Spalten hilfreich sein.

Sagen Sie bitte "" und 100 ersetzen möchten:

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