用列均值替换NA值

时间:2018-12-16 00:18:45

标签: r

我有一个数据集,其中有12列具有NA值的列, 如果可以,我可以将NA值替换为列的平均值:

data$F1[which(is.na(data$F1))] <- mean(data$F1,na.rm = TRUE)

并针对每一列分别继续。

如何编写一个for循环,该循环将检查每列并将NA替换为平均值:

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

我得到了错误:找不到对象。

3 个答案:

答案 0 :(得分:1)

我们可以使用lapply遍历各列,并根据具有该值replace的索引来NAmean元素

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

或者使用na.aggregate中的zoo更容易,默认情况下使用FUN = mean

  

na.aggregate(object,by = 1,...,FUN =平均值,                na.rm = FALSE,maxgap = Inf)

library(zoo)
data1 <- na.aggregate(data)

如果我们使用for循环,建议使用[[而不是[来对列进行子集化,因为'数据'可能是data.frame或{{1 }}或tbl_df,它们都与data.table一起使用以提取列

[[

答案 1 :(得分:0)

我知道如何用列均值替换所有NA值的最简单方法是使用tidyr包的replace_na函数。您需要的两个参数是数据框和用na替换的值的列表(列表中的第一个值是第一列的NA所替换的值,第二个值是第二列的NA所替换的值,依此类推...)。

您可以使用lapply获取列的意思:

col_means <- lapply(data, mean, na.rm = TRUE)
data1 <- replace_na(data, col_means)

答案 2 :(得分:0)

第一个注释接近右边,或者至少与我的代码不兼容。这是我的示例,它是如何工作的:

data666 <-apply(data,2,function(x)replace(x,is.na(x),mean(x,na.rm = TRUE)))

此功能替换按列计算平均值的NA值。