用列均值替换缺失值

时间:2014-09-14 16:50:17

标签: r missing-data imputation

我不知道如何循环每列以使用列均值替换NA值。当我尝试使用以下代码替换一列时,它运行良好。

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

不替换值。有人可以帮帮我吗?

12 个答案:

答案 0 :(得分:52)

对代码进行相对简单的修改可以解决问题:

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

答案 1 :(得分:43)

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

library(zoo)
na.aggregate(DF)

增加:

仅使用R的基数定义一个函数,该函数为一列执行,然后为每列提供lapply:

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

如果可以覆盖输入,则可以用以下内容替换最后一行:

DF[] <- lapply(DF, NA2mean)

答案 2 :(得分:10)

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

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

答案 3 :(得分:5)

您也可以尝试:

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

答案 4 :(得分:4)

可以使用

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

几乎一样容易。

答案 5 :(得分:2)

# 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

答案 6 :(得分:2)

还可以使用 imputeTS 包快速解决方案:

library(imputeTS)
na.mean(yourDataFrame)

答案 7 :(得分:1)

与@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 []

子集平均值的方法

答案 8 :(得分:1)

使用tidyr's replace_na的单线是

library(tidyr)
replace_na(mtcars,as.list(colMeans(mtcars,na.rm=T)))

答案 9 :(得分:0)

@Query的{​​{1}}或dplyr在这里可能有用:

mutate_all

答案 10 :(得分:0)

简单地使用Zoo,它将简单地用列值的平均值替换所有NA值:

na.aggregate(data) 

答案 11 :(得分:0)

使用data.table包,您可以使用set()函数并在列上循环,并用您选择的集合或值替换NA或任何您喜欢的内容(此处:意思是):

require(data.table)

# data
dt = copy(iris[ ,-5])
setDT(dt)
dt[1:4, Sepal.Length := NA] # introduce NAs

# replace NAs with mean (or whatever function you like)
for (j in seq_along(names(dt))) {
  set(dt,
      i = which(is.na(dt[[j]])),
      j = j, 
      value = mean(dt[[j]], na.rm = TRUE))
}