Hay muchas publicaciones sobre cómo reemplazar los valores de NA. Soy consciente de que se podrían reemplazar las NA en la siguiente tabla / marco con lo siguiente:
x[is.na(x)]<-0
Pero, ¿qué pasa si quiero restringirlo solo a ciertas columnas? Déjame mostrarte un ejemplo.
Primero, comencemos con un conjunto de datos.
set.seed(1234)
x <- data.frame(a=sample(c(1,2,NA), 10, replace=T),
b=sample(c(1,2,NA), 10, replace=T),
c=sample(c(1:5,NA), 10, replace=T))
Lo que da:
a b c
1 1 NA 2
2 2 2 2
3 2 1 1
4 2 NA 1
5 NA 1 2
6 2 NA 5
7 1 1 4
8 1 1 NA
9 2 1 5
10 2 1 1
Ok, entonces solo quiero restringir el reemplazo a las columnas 'a' y 'b'. Mi intento fue:
x[is.na(x), 1:2]<-0
y:
x[is.na(x[1:2])]<-0
Que no funciona.
Mi intento de data.table, donde y<-data.table(x)
, obviamente, nunca iba a funcionar:
y[is.na(y[,list(a,b)]), ]
Quiero pasar columnas dentro del argumento is.na, pero eso obviamente no funcionaría.
Me gustaría hacer esto en un data.frame y un data.table. Mi objetivo final es recodificar el 1: 2 a 0: 1 en 'a' y 'b' manteniendo 'c' como está, ya que no es una variable lógica. Tengo un montón de columnas, así que no quiero hacerlo una por una. Y me gustaría saber cómo hacer esto.
¿Tienes alguna sugerencia?
x[, 1:2][x[, 1:2] == 1] <- 0
x
acepta una matriz como su primer miembro solo cuando se realiza la asignación? ¿Esta característica está documentada en alguna parte? También creo que olvidó poner una coma antes de los vectores con los nombres de las columnas en su segundo ejemplo.[
, extraerá las columnas especificadas (consulte stackoverflow.com/a/21137524/1201032 ). Espero que esto responda a su pregunta, pero en el futuro, evite comentar sobre respuestas muy antiguas como esta; en su lugar, publique una nueva pregunta.In both cases, 1:2 or c("a", "b") can be replaced by a pre-defined vector.
Cuando utilicé un vector predefinido como estex[Vpredefined][is.na(x[Vpredefined])] <- 0
, me dio un errorEditar 2020-06-15
Desde
data.table
1.12.4 (octubre de 2019),data.table
obtiene dos funciones para facilitar esto:nafill
ysetnafill
.nafill
opera en columnas:cols = c('a', 'b') y[ , (cols) := lapply(.SD, nafill, fill=0), .SDcols = cols]
setnafill
opera en tablas (los reemplazos ocurren por referencia / en el lugar)setnafill(y, cols=cols, fill=0) # print y to show the effect y[]
Esto también será más eficiente que las otras opciones; Para
?nafill
obtener más información, consulte las versiones deNA
imputación de la última observación trasladada hacia adelante (LOCF) y la siguiente observación trasladada hacia atrás (NOCB) para series de tiempo.Esto funcionará para su
data.table
versión:for (col in c("a", "b")) y[is.na(get(col)), (col) := 0]
Alternativamente, como señala David Arenburg a continuación, puede usar
set
(beneficio adicional: puede usarlo endata.frame
odata.table
):for (col in 1:2) set(x, which(is.na(x[[col]])), col, 0)
fuente
out <- x
para evitar malentendidos con el x data.frame de la pregunta? De lo contrario, este es un comando aún más corto:y[, (cols):=lapply(.SD, function(i){i[is.na(i)] <- 0; i}), .SDcols = cols]
omitir el nombre de la variable 'out' y el uso de 'x'.Sobre la base de la
tidyr::replace_na()
respuesta de @Robert McDonald's , aquí hay algunasdplyr
opciones para controlar qué columnasNA
se reemplazan las s:library(tidyverse) # by column type: x %>% mutate_if(is.numeric, ~replace_na(., 0)) # select columns defined in vars(col1, col2, ...): x %>% mutate_at(vars(a, b, c), ~replace_na(., 0)) # all columns: x %>% mutate_all(~replace_na(., 0))
fuente
Error in replace_na(., 0) : argument "value" is missing, with no default
. ¿Alguna sugerencia de qué cambiar?Esto ahora es trivial en tidyr con replace_na (). La función parece funcionar tanto para data.tables como para data.frames:
tidyr::replace_na(x, list(a=0, b=0))
fuente
No estoy seguro si esto es más conciso, pero esta función también encontrará y permitirá el reemplazo de NA (o cualquier valor que desee) en columnas seleccionadas de una tabla de datos:
update.mat <- function(dt, cols, criteria) { require(data.table) x <- as.data.frame(which(criteria==TRUE, arr.ind = TRUE)) y <- as.matrix(subset(x, x$col %in% which((names(dt) %in% cols), arr.ind = TRUE))) y }
Para aplicarlo:
y[update.mat(y, c("a", "b"), is.na(y))] <- 0
La función crea una matriz de las columnas y filas seleccionadas (coordenadas de celda) que cumplen con los criterios de entrada (en este caso es.na == VERDADERO).
fuente
Podemos resolverlo de
data.table
manera contidyr::repalce_na
función ylapply
library(data.table) library(tidyr) setDT(df) df[,c("a","b","c"):=lapply(.SD,function(x) replace_na(x,0)),.SDcols=c("a","b","c")]
De esta forma, también podemos resolver pegar columnas con
NA
string. ¡Primero, nosotrosreplace_na(x,"")
, luego podemos usarstringr::str_c
para combinar columnas!fuente
Para una columna específica, existe una alternativa con
sapply
DF <- data.frame(A = letters[1:5], B = letters[6:10], C = c(2, 5, NA, 8, NA)) DF_NEW <- sapply(seq(1, nrow(DF)), function(i) ifelse(is.na(DF[i,3]) == TRUE, 0, DF[i,3])) DF[,3] <- DF_NEW DF
fuente
es bastante útil con {data.table} y {stringr}
library(data.table) library(stringr) x[, lapply(.SD, function(xx) {str_replace_na(xx, 0)})]
FYI
fuente
A partir de data.table y, puede escribir:
y[, (cols):=lapply(.SD, function(i){i[is.na(i)] <- 0; i}), .SDcols = cols]
No se olvide
library(data.table)
antes de creary
y ejecutar este comando.fuente
Esto funciona bien para mi
DataTable DT = new DataTable(); DT = DT.AsEnumerable().Select(R => { R["Campo1"] = valor; return (R); }).ToArray().CopyToDataTable();
fuente