Sostituisci i valori mancanti con la media della colonna

Non sono sicuro di come eseguire il loop su ciascuna colonna per sostituire i valori NA con la media della colonna. Quando sto cercando di sostituire per una colonna usando il seguente, funziona bene.

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

Il codice per il loop su colonne non funziona:

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

i valori non sono sostituiti. Qualcuno può aiutarmi per favore con questo?

Una modifica relativamente semplice del codice dovrebbe risolvere il problema:

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

Se DF è il tuo frame di dati di colonne numeriche:

 library(zoo) na.aggregate(DF) 

AGGIUNTO:

Usando solo la base di R definisci una funzione che lo fa per una colonna e poi lappia a ogni colonna:

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

L'ultima riga può essere sostituita con la seguente se è ansible sovrascrivere l'input:

 DF[] <- lapply(DF, NA2mean) 

Per aggiungere alle alternative, utilizzando i dati di esempio di @ akrun, farei quanto segue:

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

Puoi anche provare:

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

dati

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

lapply può essere usato al posto di un ciclo for .

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

Questo non ha alcun vantaggio sul ciclo for, anche se forse è più semplice se si hanno anche colonne non numeriche, nel qual caso

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

è quasi altrettanto facile.

 # 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 

Simile alla risposta indicata da @Thomas, questo può essere fatto anche usando il metodo ifelse() di 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]) } 

dove, Argomenti su ifelse(TEST, YES , NO) sono: –

TEST – condizione logica da verificare

– eseguito se la condizione è Vero

NO – altrimenti quando la condizione è False

e ave(x, ..., FUN = mean) è il metodo in R usato per calcolare le medie di sottoinsiemi di x []

C’è anche una soluzione rapida usando il pacchetto imputesTS :

 library(imputeTS) na.mean(yourDataFrame)