2010-07-28 9 views
48

Ich habe einen Datenrahmen, der (an zufälligen Stellen) einen Zeichenwert (zB "foo") enthält, den ich durch einen NA ersetzen möchte.Ersetzen von Zeichenwerten mit NA in einem Datenrahmen

Was ist der beste Weg, dies über den gesamten Datenrahmen zu tun?

+1

Sie nicht Ihre Spalte as.numeric() Schalten Sie ein paar Zeichen von‚foo‘zu NA die coerce nicht neu zu definieren ganz auf numerisch gesetzt. Du musst es erzwingen. (Wenn Sie das tun) –

Antwort

61

Dieses:

df[ df == "foo" ] <- NA 
+12

Beachten Sie, dass, wenn Sie versuchten, NA durch "foo" zu ersetzen, das Umgekehrte ('df [df == NA] =" foo "') nicht funktioniert; Sie müssten 'df [is.na (df)] <-" foo "' –

57

Eine Möglichkeit, dies im Keim zu ersticken ist das Zeichen zu NA konvertieren, wenn Sie die Daten in an erster Stelle zu lesen.

df <- read.csv("file.csv", na.strings = c("foo", "bar")) 
0

Eine alternative Möglichkeit ist unten zu lösen:

for (i in 1:ncol(DF)){ 
    DF[which(DF[,i]==""),columnIndex]<-"ALL" 
    FinalData[which(is.na(FinalData[,columnIndex])),columnIndex]<-"ALL" 
} 
2

Eine weitere Option ist is.na<-:

is.na(df) <- df == "foo" 

Beachten Sie, dass die Verwendung ein wenig kontraintuitiv erscheinen mag, aber es tatsächlich weist dem Index auf der rechten SeiteNA Werte zu df zu.

+1

oder das gleiche ''is.na <-' (df, df ==" foo ")' verwenden – jogo

0

Dies könnte getan werden, mit dplyr ‚s mutate_all und replace: vergessen

library(dplyr) 
df <- data_frame(a = c('foo', 2, 3), b = c(1, 'foo', 3), c = c(1,2,'foobar'), d = c(1, 2, 3)) 

> df 
# A tibble: 3 x 4 
    a  b  c  d 
    <chr> <chr> <chr> <dbl> 
1 foo  1  1  1 
2  2 foo  2  2 
3  3  3 foobar  3 


df <- mutate_all(df, funs(replace(., .=='foo', NA))) 

> df 
# A tibble: 3 x 4 
     a  b  c  d 
    <chr> <chr> <chr> <dbl> 
1 <NA>  1  1  1 
2  2 <NA>  2  2 
3  3  3 foobar  3