Присвоение категориальных значений НС случайным или пропорциональным образом - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть набор данных:

df <- structure(list(gender = c("female", "male", NA, NA, "male", "male", 
"male"), Division = c("South Atlantic", "East North Central", 
"Pacific", "East North Central", "South Atlantic", "South Atlantic", 
"Pacific"), Median = c(57036.6262, 39917, 94060.208, 89822.1538, 
107683.9118, 56149.3217, 46237.265), first_name = c("Marilyn", 
"Jeffery", "Yashvir", "Deyou", "John", "Jose", "Daniel")), row.names = c(NA, 
-7L), class = c("tbl_df", "tbl", "data.frame"))

Мне нужно выполнить анализ, чтобы у меня не было значений NA в переменной gender.Другие столбцы слишком малы и не имеют известного прогнозирующего значения, так что вменение значений на самом деле невозможно.

Я могу выполнить анализ, полностью удалив неполные наблюдения - они составляют около 4% набора данных,но я хотел бы видеть результаты, случайным образом присваивая female или male пропущенным кейсам.

Кроме написания довольно уродливого кода для фильтрации только неполных кейсов, деления на два и замены NA s с female или male в каждой половине, я задавался вопросом, был ли элегантный способ случайным или пропорциональным назначением значений в NA s?

Ответы [ 3 ]

0 голосов
/ 24 февраля 2019

Как насчет этого:

> df <- structure(list(gender = c("female", "male", NA, NA, "male", "male", 
+                                 "male"),
+                      Division = c("South Atlantic", "East North Central", 
+                                   "Pacific", "East North Central", "South Atlantic", "South Atlantic", 
+                                   "Pacific"),
+                      Median = c(57036.6262, 39917, 94060.208, 89822.1538,
+                                 107683.9118, 56149.3217, 46237.265),
+                      first_name = c("Marilyn", "Jeffery", "Yashvir", "Deyou", "John", "Jose", "Daniel")),
+                 row.names = c(NA, -7L), class = c("tbl_df", "tbl", "data.frame"))
> 
> Gender <- rbinom(length(df$gender), 1, 0.52)
> Gender <- factor(Gender, labels = c("female", "male"))
> 
> df$gender[is.na(df$gender)] <- as.character(Gender[is.na(df$gender)])
> 
> df$gender
[1] "female" "male"   "female" "female" "male"   "male"   "male"  
> 

Это случайно с заданной вероятностью.Вы также можете рассмотреть возможность вменения значений, используя ближайших соседей, «горячий стол» или подобное.

Надеюсь, это поможет.

0 голосов
/ 24 февраля 2019

Просто назначьте

df$gender[is.na(df$gender)]=sample(c("female", "male"), dim(df)[1], replace = TRUE)[is.na(df$gender)]
0 голосов
/ 23 февраля 2019

Мы можем использовать ifelse и is.na, чтобы определить, существует ли na, а затем использовать sample, чтобы случайным образом выбрать female и male.

df$gender <- ifelse(is.na(df$gender), sample(c("female", "male"), 1), df$gender)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...