Вменяйте пропущенные данные со средним значением по группе - PullRequest
3 голосов
/ 25 марта 2019

У меня есть категориальная переменная с тремя уровнями (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, но, возможно, цикл forif и else) мог бы сработать?

Ответы [ 2 ]

2 голосов
/ 25 марта 2019
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))
0 голосов
/ 25 марта 2019

Вы можете использовать пакет 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
    })]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...