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
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
SÌ – 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)