2010-07-28 10 views
48

Tengo un marco de datos que contiene (en lugares aleatorios) un valor de carácter (digamos "foo") que deseo reemplazar con un NA.Reemplazar valores de caracteres con NA en un marco de datos

¿Cuál es la mejor manera de hacerlo en todo el marco de datos?

+1

No se olvide de volver a definir su as.numeric columna() de conmutación de unos personajes de 'foo' a NA no va a obligar a la conjunto completo a numérico. Tienes que forzarlo. (Si eso es lo que está haciendo) –

Respuesta

61

Este:

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

Tenga en cuenta que si intenta reemplazar NA con "foo", el reverso ('df [df == NA] =" foo "' no funcionará; necesitarías usar 'df [is.na (df)] <-" foo "' –

57

Una forma de cortar de raíz este es convertir ese carácter a NA cuando lee los datos en en el primer lugar.

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

Una forma alternativa de resolver es el siguiente:

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

Otra opción es is.na<-:

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

Tenga en cuenta que su uso puede parecer un poco contrario a la intuición, pero en realidad asignaNA valores a df en el índice en el lado derecho.

+1

o lo mismo ''is.na <-' (df, df ==" foo ")' – jogo

0

Esto podría hacerse con dplyr 's mutate_all y replace:

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 
Cuestiones relacionadas