Я хочу обновить отсутствующие значения в столбце, используя средние значения, рассчитанные из того же столбца по группам. В качестве примера, вот репрезент, основанный на наборе данных train.csv из данных Titani c. Я хочу обновить отсутствующие значения в столбце «Возраст» по среднему возрасту для групп, определенных переменными «Пол», «Вступил» и «Класс» (я сохраняю эти переменные как факторы до получения среднего возраста).
Единственный способ, которым я мог придумать это, - это подгруппировать недостающие данные, заполнить недостающий возраст средним возрастом групп, а затем rbind
результат с остальной частью набора данных.
library(data.table)
train <- fread("https://raw.githubusercontent.com/nybbles/kaggle/master/train.csv")
train[,sex := factor(sex)]
train[,survived := factor(survived, labels = c("did not survive","survived"))]
train[embarked == "",embarked := "S"]
train[,embarked := factor(embarked,labels = c("Cherbourg","Queenstown","Southampton"))]
train[,pclass := factor(pclass,ordered = T,levels = c(3,2,1))]
train[is.na(age),.N] # 177 missing in age column
age_imputed <- train[!is.na(age),.(age = median(age)),.(sex,embarked,pclass)] #Step 1
age_missing <- train[is.na(age)] #Step 2
train <- train[!is.na(age)] #Step 3
age_missing[,age:=NULL] #Step 4
age_missing <- age_imputed[age_missing,on = c("sex","embarked","pclass")] #Step 5
train <- rbindlist(list(train,age_missing), use.names = TRUE)# Step 6
Вместо этого, есть ли «более быстрый» способ сделать это по ссылке, вместо подмножества данных? Подмножество и rbind
данных кажется мне излишне манипулятивным и подверженным ошибкам. Я пробовал
train[,Age := ifelse(is.na(Age),age_imputed$Age[which(age_imputed$Sex == train$Sex & age_imputed$Embarked == train$Embarked & age_imputed$Pclass == train$Pclass)],
Age)]
в качестве потенциального решения, но постоянно сталкивался с различными ошибками.