Создание переменной, которая указывает тип домохозяйства - подмножество, условный выбор, спор закрытых данных - PullRequest
0 голосов
/ 08 апреля 2019

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

hh_id   is_head_of_household    married   gender   age
1          1                    single    male     28
1          0                    single    female   27
2          1                    married   male     33
2          0                    married   female   34
2          1                    single    male     6

Мне нужно создать переменную, которая указывает тип домашнего хозяйства по этим четырем конкретным категориям: «один глава семьи - мужчина», «одиндомашнее хозяйство женского пола "," семейная пара "," не состоящая в браке пара "

Например, каждое домашнее хозяйство имеет уникальный идентификационный номер, а первое домашнее хозяйство представляет собой пару, не состоящую в браке, поскольку как минимум двое взрослых (18 лет и старше) и по крайней мере один из них является главой семьи (1 или 0) и оба указаны как "холостые" в колонке о браке.Второе домашнее хозяйство - супружеская пара, потому что есть по крайней мере двух взрослых, один из которых является главой, и они перечислены как "замужем" в колонке о браке.В домохозяйстве, состоящем из "одного мужчины" или "одинокой женщины", СОСТОИТСЯ один взрослый мужчина или женщина, который также является главой домохозяйства.Любые другие люди в семье должны быть детьми (до 18 лет).

Я попытался создать столбец, который бы указывал одну из этих четырех категорий для КАЖДОГО УНИКАЛЬНОГО идентификатора домохозяйства, используя dplyr:

Сначала я создал категорию для взрослых или детей:

individual_data["adult"] <- NA
individual_data$adult <- ifelse(individual_data$age >= 18, "adult", 
"child")

Это код, который у меня есть для попытки создать переменную для отдельных домохозяйств:

individual_data["if_adult"] <- ifelse(individual_data$age >= 18, "1","0")
library(dplyr)
individual_data %>% 
group_by(hh_id) %>% 
mutate(unmarried_couple = sum(if_adult*(married =="Single"))==1,
total_adults = sum(if_adult))  

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

   hh_id   is_head_of_household    married   gender   age     type
   1          1                    single    male     28  unmarried couple
   1          0                    single    female   27  unmarried couple
   2          1                    married   male     33    married couple
   2          0                    married   female   34    married couple
   2          1                    single    male     6     married couple
   ..
   n          ----------------------------------------------------------

Должна быть ОДНА классификация для КАЖДОГО hh_id.Как я могу найти решение этой проблемы в dplyr?

структура данных:

structure(list(hh_id = c(1L, 1L, 2L, 2L, 2L, 3L, 3L, 4L, 4L, 
5L), person_id = 1:10, is_head_of_household = c(1L, 0L, 1L, 0L, 
0L, 1L, 0L, 1L, 0L, 1L), married = structure(c(2L, 2L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 2L), .Label = c("Married", "Single"), class = "factor"), 
gender = structure(c(2L, 5L, 2L, 5L, 5L, 2L, 5L, 2L, 3L, 
2L), .Label = c("F", "Female", "FEMALE", "M", "Male", "MALE"
), class = "factor"), race = structure(c(3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L), .Label = c("Asian", "Black", "White"
), class = "factor"), age = c(28L, 27L, 34L, 33L, 6L, 28L, 
29L, 30L, 3L, 30L), voted_in_2012 = c(0L, 1L, 0L, 1L, 0L, 
0L, 1L, 0L, 0L, 1L), is_college_graduate = c(1L, 1L, 1L, 
0L, 1L, 1L, 0L, 1L, 0L, 1L), adult = c("adult", "adult", 
"adult", "adult", "child", "adult", "adult", "adult", "child", 
"adult")), row.names = c(NA, 10L), class = "data.frame")

1 Ответ

0 голосов
/ 08 апреля 2019

Редактировать: married преобразуется в нижний регистр в case_when, чтобы зафиксировать ситуации, когда эта переменная пишется с заглавной буквы иначе, чем выборочные данные.

library(dplyr)
hh_types <- individual_data %>%
  filter(age >= 18) %>%  # only concerned with adults for categorization
  arrange(hh_id, -is_head_of_household) %>%   # bring head of hh to top
  group_by(hh_id) %>%              # For each hh_id...
  mutate(adult_count = n()) %>%    # ... how many adults
  slice(1) %>%                     # just keep the top row  (the head)
  ungroup() %>%

  mutate(category = case_when(
    tolower(married) == "married"   & adult_count > 1 ~ "married couple",
    tolower(married) == "single" & adult_count > 1 ~ "unmarried couple",
    adult_count == 1   ~ paste("single", gender, "head of household"),
    TRUE   ~  "Other")) %>%
  select(hh_id, category)


individual_data %>%
  left_join(hh_types)
#Joining, by = "hh_id"
#  hh_id is_head_of_household married gender age                        category
#1     1                    1  single   male  28                unmarried couple
#2     1                    0  single female  27                unmarried couple
#3     2                    1 married   male  33                  married couple
#4     2                    0 married female  34                  married couple
#5     2                    1  single   male   6                  married couple
#6     3                    1  single female  30 single female head of household
#7     4                    1  single   male  28   single male head of household

Пример данных с одним добавленным чч:

individual_data <- read.table(
  header = T,
  stringsAsFactors = F, 
  colClasses = c("integer", "integer", "character", "character", "integer"),
  text = "hh_id   is_head_of_household    married   gender   age
1          1                    single    male     28
1          0                    single    female   27
2          1                    married   male     33
2          0                    married   female   34
2          1                    single    male     6
3          1                    single    female   30
4          1                    single    male     28"
)
...