用列平均值replaceR中的缺失值

我是新来的R,我不知道如何循环每列以取代列值的NA值。 当我尝试使用以下replace为一列时,它运作良好。

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

但循环列的代码不起作用

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

但是价值观并没有被取代。

有人可以帮我这个吗?

您的代码的一个相对简单的修改应该解决这个问题:

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

如果DF是数字列的数据框:

 library(zoo) na.aggregate(DF) 

添加:

只使用R的基础定义一个函数,它为一列,然后推到每一列:

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

如果可以覆盖input,则最后一行可以replace为以下内容:

 DF[] <- lapply(DF, NA2mean) 

要添加到替代品,使用@ akrun的示例数据,我会执行以下操作:

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

你也可以尝试:

  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可以用来代替for循环。

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

这对于for循环来说并没有任何优势,但是如果你有非数字的列,也许会更容易,在这种情况下

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

几乎一样容易。

类似于@Thomas指出的答案,这也可以使用R的ifelse()方法完成:

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

在哪里, ifelse(TEST, YES , NO)是: –

TEST – 要检查的逻辑条件

– 如果条件为真,则执行

– 否则当条件为假时

ave(x, ..., FUN = mean)是R中的方法,用于计算x []的子集的平均值

 # 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 
 #create logical vector where all data = NA is TRUE. datana<-is.na(mydata) #Subset your data with the logical vector so that all TRUE values will #be replaced with the rounded mean of my data. mydata(datana)<-round(mean(mydata, na.rm = TRUE)) 
Interesting Posts