我有一个数据集,其中有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)}
我得到了错误:找不到对象。
答案 0 :(得分:1)
我们可以使用lapply
遍历各列,并根据具有该值replace
的索引来NA
个mean
元素
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值。