Teniendo un marco de datos, ¿cómo hago para reemplazar todos los valores particulares a lo largo de todas las filas y columnas? Digamos, por ejemplo, que quiero reemplazar todos los registros vacíos con NA
's (sin escribir las posiciones):
df <- data.frame(list(A=c("", "xyz", "jkl"), B=c(12, "", 100)))
A B
1 12
2 xyz
3 jkl 100
Resultado Esperado:
A B
1 NA 12
2 xyz NA
3 jkl 100
df[df=="xyz"]<-"abc"
producirá un error con "nivel de factor no válido". ¿Existe una solución más general?Como PikkuKatja y Glallen pidieron una solución más general y aún no puedo comentar, escribiré una respuesta. Puede combinar declaraciones como en:
> df[df=="" | df==12] <- NA > df A B 1 <NA> <NA> 2 xyz <NA> 3 jkl 100
Para los factores, el código de zxzak ya produce factores:
> 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
Si tiene problemas, sugeriría eliminar temporalmente los factores.
fuente
Aquí hay un par de
dplyr
opciones: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'))
fuente
Podemos usar data.table para obtenerlo rápidamente. Primero cree df sin factores,
df <- data.frame(list(A=c("","xyz","jkl"), B=c(12,"",100)), stringsAsFactors=F)
Ahora puedes usar
setDT(df) for (jj in 1:ncol(df)) set(df, i = which(df[[jj]]==""), j = jj, v = NA)
y puede convertirlo de nuevo en un data.frame
Si solo desea usar data.frame y mantener los factores, es más difícil, debe trabajar con
levels(df$value)[levels(df$value)==""] <- NA
donde valor es el nombre de cada columna. Necesitas insertarlo en un bucle.
fuente
Si desea reemplazar varios valores en un marco de datos, recorrer todas las columnas puede ser útil.
Digamos que desea reemplazar
""
y100
:na_codes <- c(100, "") for (i in seq_along(df)) { df[[i]][df[[i]] %in% na_codes] <- NA }
fuente