循环以无法正常工作的方式填充NA

时间:2018-08-01 15:04:17

标签: r

我试图用每列的平均值填充字段中的所有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))

我在粘贴部分中使用了`,因为某些列在单词之间可能有空格,并且我无法更改。我感觉这是错误所在。

1 个答案:

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