Как можно заменить отсутствующие значения в столбце значениями, полученными из того же столбца? - PullRequest
0 голосов
/ 20 июня 2020

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

в качестве потенциального решения, но постоянно сталкивался с различными ошибками.

1 Ответ

0 голосов
/ 20 июня 2020

Вы можете попробовать соединение обновлений с левой таблицей (.SD), являющейся строками с NA для Age:

train[is.na(Age), Age :=
    age_imputed[.SD, on=.(Sex, Embarked, Pclass), x.Age]
]
...