按组估算缺失数据
Impute missing data with mean by group
我有一个具有三个水平(A
、B
和 C
)的分类变量。
我还有一个连续变量,上面有一些缺失值。
我想用其组的平均值替换 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)
现在,我知道我可以对组 B
和 C
做同样的事情,但也许是 for
循环(使用 if
和 else
) 可以解决问题吗?
require(dplyr)
data %>% group_by(group) %>%
mutate(variable=ifelse(is.na(variable),mean(variable,na.rm=TRUE),variable))
要获得更快的 base-R 版本,您可以使用 ave
:
data$variable<-ave(data$variable,data$group,FUN=function(x)
ifelse(is.na(x), mean(x,na.rm=TRUE), x))
你可以使用 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
})]
我有一个具有三个水平(A
、B
和 C
)的分类变量。
我还有一个连续变量,上面有一些缺失值。
我想用其组的平均值替换 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)
现在,我知道我可以对组 B
和 C
做同样的事情,但也许是 for
循环(使用 if
和 else
) 可以解决问题吗?
require(dplyr)
data %>% group_by(group) %>%
mutate(variable=ifelse(is.na(variable),mean(variable,na.rm=TRUE),variable))
要获得更快的 base-R 版本,您可以使用 ave
:
data$variable<-ave(data$variable,data$group,FUN=function(x)
ifelse(is.na(x), mean(x,na.rm=TRUE), x))
你可以使用 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
})]