valores una reemplazar perdidos omitir modificar eliminar data columna caracter cambiar r missing-data imputation

una - Reemplazar los valores perdidos con media de la columna



reemplazar valores data frame r (8)

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

No estoy seguro de cómo recorrer cada columna para reemplazar los valores de NA con la media de la columna. Cuando intento 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?


Si DF es su marco de datos 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)


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)


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))


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) }


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)) a b 2.0 1.0 3.0 2.0 4.0 3.0 3.5 4.0 5.0 2.5 3.5 2.5