Как вменять данные в зависимости от класса - PullRequest
0 голосов
/ 30 ноября 2018

Привет всем, я ищу элегантный способ вписать NA в мой набор данных:

Sex Age
M   20
M   21
F   30
M   NA
F   26
F   29
F   NA

Я хотел бы рассчитать разный средний возраст для каждого пола.Я предполагаю, что распределение по возрасту для женщин и мужчин немного отличается.К сожалению, я не вижу возможности сделать это без создания нового столбца и повторного ввода в набор данных.Несмотря на то, что я иду этим путем, это не работает, и я думаю, что я переосмысливаю проблему:

    males <- train[train[, "Sex"]=="male", ]
    females <- train[train[, "Sex"]=="female", ] 

    mf <- mean(train$Age, na.rm = TRUE)  
    mm <- mean(train$Age, na.rm = TRUE)

    train[train$Age == NA & train$Sex == "male", "Age"] <- mf 

    Error in '[<-.data.frame`(`*tmp*`, males$Age == NA & males$Sex == "male",  
    : missing values are not allowed in subscripted assignments of data frames

Могу ли я попросить какие-нибудь советы?

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Если вам нужно больше правдоподобных значений, чем просто среднее значение для каждого пропущенного значения, вы можете рассмотреть пакет mice:

df_old <- data.frame(Sex = c(rep("M", 500), rep("F", 500)),
                 Age = round(c(rnorm(500, 35, 2), rnorm(500, 25, 2))))

df_NA <- data.frame(Sex = sample(c("M", "F"), 10, rep = T),
                    Age = NA)

df_old %>% 
  group_by(Sex) %>%
  summarise(Mean = mean(Age))

Вот средства для обоих полов:

# A tibble: 2 x 2
  Sex    Mean
  <fct> <dbl>
1 F      24.9
2 M      34.9

Теперь объединяем оба фрейма данных и вменяем значения, используя mice:

df <- rbind(df_old, df_NA)

library(mice)
df_imp <- complete(mice(df, m=5, maxit=50, meth='pmm', seed=500), 1)
cbind(tail(df, n = 10), tail(df_imp, n = 10))

Мы использовали алгоритм прогнозирования среднего соответствия *1013* algortihm, чтобы рассчитать пропущенные значения.Есть несколько других доступных алгоритмов (?mice).Последняя строка показывает вам вмененные значения:

       Sex Age Sex Age
1001   M  NA   M  30
1002   F  NA   F  24
1003   M  NA   M  33
1004   M  NA   M  33
1005   F  NA   F  25
1006   M  NA   M  35
1007   M  NA   M  36
1008   M  NA   M  36
1009   M  NA   M  37
1010   F  NA   F  27
0 голосов
/ 30 ноября 2018

Чтобы проверить, является ли значение NA в R, вы должны использовать функцию is.na(something).Прямое сравнение something==NA или something=="NA" приведет к ошибке.

mm <- mean(train$Age[train$Sex=="male"], na.rm = TRUE)
mf <- mean(train$Age[train$Sex=="female"] , na.rm = TRUE)

train$Age[is.na(train$Age) & train$Sex=="male"] <- mm
train$Age[is.na(train$Age) & train$Sex=="female"] <- mf
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...