superponer - Una función para rellenar una columna con NA del mismo tipo
superponer graficas en r (5)
Otra forma de cambiar todas las columnas a la vez manteniendo las clases de las variables:
df[] <- lapply(df, function(x) {type <- class(x); x <- NA; class(x) <- type; x})
df
# A tibble: 3 x 2
# x y
# <dbl> <chr>
#1 NA <NA>
#2 NA <NA>
#3 NA <NA>
Como @digEmAll notificó en los comentarios, hay otra forma similar pero más corta:
df[] <- lapply(df, function(x) as(NA,class(x)))
Tengo un marco de datos con muchas columnas de diferentes tipos. Me gustaría reemplazar cada columna con NA de la clase correspondiente.
por ejemplo:
df = data_frame(x = c(1,2,3), y = c("a", "b", "c"))
df[, 1:2] <- NA
produce un marco de datos con dos columnas lógicas, en lugar de numérico y carácter. Sé que puedo decir R:
df[,1] = as.numeric(NA)
df[,2] = as.character(NA)
¿Pero cómo hago esto colectivamente en un bucle para todas las columnas con todos los tipos posibles de NA?
Otra solución que se aplica a todas las columnas puede ser especificar las no-NA y reemplazarlas por NA, es decir,
df[!is.na(df)] <- NA
lo que da,
# A tibble: 3 x 2 x y <dbl> <chr> 1 NA <NA> 2 NA <NA> 3 NA <NA>
Puedes usar este "truco":
df[1:nrow(df),1] <- NA
df[1:nrow(df),2] <- NA
el [1:nrow(df),]
básicamente le dice a R que reemplace todos los valores en la columna con NA
y de esta manera el NA
lógico es obligado al tipo original de la columna antes de reemplazar los otros valores.
Además, si tiene muchas columnas para reemplazar y el data_frame tiene muchas filas, sugiero almacenar los índices de las filas y reutilizarlos:
rowIdxs <- 1:nrow(df)
df[rowIdxs ,1] <- NA
df[rowIdxs ,2] <- NA
df[rowIdxs ,3] <- NA
...
Según lo sugerido por @RonakShah , también puede usar:
df[TRUE, 1] <- NA
df[TRUE, 2] <- NA
...
Como lo señaló @Cath ambos métodos aún funcionan cuando selecciona más de una columna, por ejemplo:
df[TRUE, 1:3] <- NA
# or
df[1:nrow(df), 1:3] <- NA
Usando bind_cols()
de dplyr
también puedes hacer:
df <- data_frame(x = c(1,2,3), y = c("a", "b", "c"))
classes <- sapply(df, class)
df[,1:2] <- NA
bind_cols(lapply(colnames(x), function(x){eval(parse(text=paste0("as.", classes[names(classes[x])], "(", df[,x],")")))}))
V1 V2
<dbl> <chr>
1 NA NA
2 NA NA
3 NA NA
Tenga en cuenta que esto cambiará los nombres de los collares.
Usando dplyr :: na_if :
library(dplyr)
df %>%
mutate(x = na_if(x, x),
y = na_if(y, y))
# # A tibble: 3 x 2
# x y
# <dbl> <chr>
# 1 NA NA
# 2 NA NA
# 3 NA NA
Si queremos mutar solo un subconjunto de columnas a NA , entonces:
# dataframe with extra column that stay unchanged
df = data_frame(x = c(1,2,3), y = c("a", "b", "c"), z = c(4:6))
df %>%
mutate_at(vars(x, y), funs(na_if(.,.)))
# # A tibble: 3 x 3
# x y z
# <dbl> <chr> <int>
# 1 NA NA 4
# 2 NA NA 5
# 3 NA NA 6