按组用平均值填补缺失数据

12
我有一个包含三个级别(ABC)的分类变量。
我还有一个连续变量,其中一些值是缺失的。
我希望用各组的平均值替换NA值。也就是说,来自组A的缺失观察值必须用A组的平均值替换。
我知道可以计算每个组的平均值并替换缺失值,但我确定有另一种更高效的方法,可以使用循环实现。
A <- subset(data, group == "A")
mean(A$variable, rm.na = TRUE)
A$variable[which(is.na(A$variable))] <- mean(A$variable, na.rm = TRUE)

现在,我明白我可以对组BC执行相同的操作,但也许一个带有ifelsefor循环可以解决问题?


请创建一个最小化的工作示例:https://dev59.com/eG025IYBdhLWcg3whGSx - emilliman5
2个回答

9
require(dplyr)
data %>% group_by(group) %>%
mutate(variable=ifelse(is.na(variable),mean(variable,na.rm=TRUE),variable))

对于更快的、基本的R版本,您可以使用ave:

data$variable<-ave(data$variable,data$group,FUN=function(x) 
  ifelse(is.na(x), mean(x,na.rm=TRUE), x))

仅仅为了好玩,我在上面添加了一个基于R语言的解决方案。 - iod
我不确定你在寻找什么。请将其作为一个新问题发布。如果您希望我检查它,可以在此处留下评论并附上链接。 - iod

0
你可以使用data.table包来实现这个功能。
tomean <- c("var1", "var2")
library(data.table)
setDT(dat)
dat[, (tomean) := lapply(tomean, function(x) {
        x <- get(x)
        x[is.na(x)] <- mean(x, na.rm = TRUE)
        x
    })]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接