Reemplazar los valores perdidos con media de la columna

No estoy seguro de cómo recorrer cada columna para reemplazar los valores de NA con la media de la columna. Cuando bash reemplazar una columna por el siguiente, funciona bien.

Column1[is.na(Column1)] <- round(mean(Column1, na.rm = TRUE)) 

El código para el bucle sobre columnas no funciona:

 for(i in 1:ncol(data)){ data[i][is.na(data[i])] <- round(mean(data[i], na.rm = TRUE)) } 

los valores no son reemplazados ¿Puede alguien ayudarme con esto?

Una modificación relativamente simple de tu código debería resolver el problema:

 for(i in 1:ncol(data)){ data[is.na(data[,i]), i] <- mean(data[,i], na.rm = TRUE) } 

Si DF es su dataframe de columnas numéricas:

 library(zoo) na.aggregate(DF) 

ADICIONAL:

Al usar solo la base de R, se define una función que lo hace para una columna y luego se aplica a cada columna:

 NA2mean <- function(x) replace(x, is.na(x), mean(x, na.rm = TRUE)) replace(DF, TRUE, lapply(DF, NA2mean)) 

La última línea podría reemplazarse con lo siguiente si está bien sobreescribir la entrada:

 DF[] <- lapply(DF, NA2mean) 

Para agregar a las alternativas, usando los datos de muestra de @ akrun, haría lo siguiente:

 d1[] <- lapply(d1, function(x) { x[is.na(x)] <- mean(x, na.rm = TRUE) x }) d1 

También puedes probar:

  cM <- colMeans(d1, na.rm=TRUE) indx <- which(is.na(d1), arr.ind=TRUE) d1[indx] <- cM[indx[,2]] d1 

datos

 set.seed(42) d1 <- as.data.frame(matrix(sample(c(NA,0:5), 5*10, replace=TRUE), ncol=10)) 

lapply se puede usar en lugar de un bucle for .

 d1[] <- lapply(d1, function(x) ifelse(is.na(x), mean(x, na.rm = TRUE), x)) 

Esto realmente no tiene ninguna ventaja sobre el bucle for, aunque quizás sea más fácil si también tiene columnas no numéricas, en cuyo caso

 d1[sapply(d1, is.numeric)] <- lapply(d1[sapply(d1, is.numeric)], function(x) ifelse(is.na(x), mean(x, na.rm = TRUE), x)) 

es casi tan fácil.

 # Lets say I have a dataframe , df as following - df <- data.frame(a=c(2,3,4,NA,5,NA),b=c(1,2,3,4,NA,NA)) # create a custom function fillNAwithMean <- function(x){ na_index <- which(is.na(x)) mean_x <- mean(x, na.rm=T) x[na_index] <- mean_x return(x) } (df <- apply(df,2,fillNAwithMean)) ab 2.0 1.0 3.0 2.0 4.0 3.0 3.5 4.0 5.0 2.5 3.5 2.5 

Similar a la respuesta señalada por @Thomas, Esto también se puede hacer usando el método ifelse() de R:

 for(i in 1:ncol(data)){ data[,i]=ifelse(is.na(data[,i]), ave(data[,i],FUN=function(y) mean(y, na.rm = TRUE)), data[,i]) } 

donde, Arguments to ifelse(TEST, YES , NO) son: –

TEST – condición lógica a verificar

– se ejecuta si la condición es verdadera

NO – else cuando la condición es False

y ave(x, ..., FUN = mean) es el método en R usado para calcular promedios de subconjuntos de x []

También hay una solución rápida usando el paquete imputeTS :

 library(imputeTS) na.mean(yourDataFrame) 
    Intereting Posts