我试图用每列的平均值填充字段中的所有NA。
我一直在使用的代码是:
var1<-colnames(DF)
for (i in 1:length(var1)) {
v<-paste0("`",var1[i],"`")
DF<-DF %>%
mutate(v=ifelse(is.na(v),mean(v,na.rm=TRUE),v))
}
运行这段代码后,DF没有任何反应。
我已经尝试运行单个列,并且代码有效:
DF<-DF%>%
mutate(col1=ifelse(is.na(col1),mean(col1,na.rm=TRUE),col1))
我在粘贴部分中使用了`,因为某些列在单词之间可能有空格,并且我无法更改。我感觉这是错误所在。
答案 0 :(得分:2)
对于多列,请使用mutate_at
(对于所有列-mutate_all
)
DF %>%
mutate_all(funs(ifelse(is.na(.), mean(., na.rm = TRUE), .)))
可以使用na.aggregate
中的zoo
使其紧凑(将NA用每列的mean
替换。默认为FUN = mean
)
library(zoo)
na.aggregate(DF)
如果我们使用for
循环,则不需要包。只需使用该列的NA
更新该列的mean
元素
for(nm in var1) DF[[nm]][is.na(DF[[nm]])] <- mean(DF[[nm]], na.rm = TRUE)
或与lapply
DF[] <- lapply(DF, function(x) replace(x, is.na(x), mean(x, na.rm = TRUE)))
或使用colMeans
DF[is.na(DF)] <- colMeans(DF, na.rm = TRUE)[col(DF)][is.na(DF)]
set.seed(24)
DF <- as.data.frame(matrix(sample(c(NA, 0:5), 20 *5, replace = TRUE), 20, 5))