web-dev-qa-db-ger.com

Ersetzen Sie alle bestimmten Werte in einem Datenrahmen

Wie kann ich mit einem Datenrahmen alle bestimmten Werte in allen Zeilen und Spalten ersetzen? Angenommen, ich möchte alle leeren Datensätze durch NA ersetzen (ohne die Positionen einzugeben):

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
64
zxzak

So was:

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

Da PikkuKatja und glallen nach einer allgemeineren Lösung gefragt haben und ich noch nicht kommentieren kann, werde ich eine Antwort schreiben. Sie können Anweisungen wie folgt kombinieren:

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

Für Faktoren liefert der Code von zxzak bereits 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 es Probleme gibt, würde ich vorschlagen, die Faktoren vorübergehend zu löschen.

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

Wir können data.table verwenden, um es schnell zu bekommen.

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

Jetzt können Sie verwenden

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

und Sie können es zurück in einen data.frame konvertieren

setDF(df)

Wenn Sie nur data.frame verwenden und Faktoren beibehalten möchten, ist es schwieriger, mit zu arbeiten 

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

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

3
skan

Hier sind ein paar dplyr Optionen:

library(dplyr)

# all columns:
df %>% 
  mutate_all(~na_if(., ''))

# specific column types:
df %>% 
  mutate_if(is.factor, ~na_if(., ''))

# specific columns:  
df %>% 
  mutate_at(vars(A, B), ~na_if(., ''))

# or:
df %>% 
  mutate(A = replace(A, A == '', NA))

# replace can be used if you want something other than NA:
df %>% 
  mutate(A = as.character(A)) %>% 
  mutate(A = replace(A, A == '', 'used to be empty'))
2
sbha

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

Angenommen, Sie möchten "" und 100 ersetzen:

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