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
SÍ - 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