2010-07-28 7 views
48

J'ai une trame de données contenant (dans des endroits aléatoires) une valeur de caractère (disons "foo") que je veux remplacer par NA.Remplacement des valeurs de caractères par NA dans une trame de données

Quelle est la meilleure façon de le faire dans l'ensemble du bloc de données?

+1

Ne pas oublier de redéfinir votre as.numeric de colonne() de commutation quelques caractères de « foo » à NA ne forcera pas la ensemble complet à numérique. Vous devez le forcer. (Si c'est ce que vous faites) –

Répondre

61

Ce:

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

Notez que si vous essayiez de remplacer NA par "foo", l'inverse ('df [df == NA] =" foo "') ne fonctionnera pas; vous auriez besoin d'utiliser 'df [is.na (df)] <-" foo "' –

57

Une façon de étouffer dans l'œuf est de convertir ce caractère à NA quand vous lisez les données en premier lieu.

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

Une autre façon de résoudre est ci-dessous:

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

Une autre option est is.na<-:

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

Notez que son utilisation peut sembler un peu contre-intuitif, mais il fait attribueNA valeurs à df à l'index sur le côté droit.

+1

ou le même '' is.na <- '(df, df == "foo") ' – jogo

0

Cela pourrait se faire avec l » mutate_all et replacedplyr:

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 
Questions connexes