Создание переменной, указывающей тип домохозяйства — подмножество, условный отбор, обработка данных-Закрыто

#r #dataframe #dplyr #conditional #subset

#r #фрейм данных #dplyr #условные операторы #подмножество

Вопрос:

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

 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. Является ли «глава домохозяйства» здесь синонимом слова «мужчина»? Если да, можно ли это удалить? Похоже, что это не передает никакой дополнительной информации. (Возможно, ваши данные подразумевают это случайно — может ли женщина быть главой одинокого или состоящего в браке домохозяйства?).

2. главой одинокого или состоящего в браке домохозяйства могут быть как женщины, так и мужчины

3. Правильно, спасибо — это выглядело избыточным с точки зрения данных.

Ответ №1:

Редактировать: преобразовано 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"   amp; adult_count > 1 ~ "married couple",
    tolower(married) == "single" amp; 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
  

Добавлены выборочные данные с одним hh:

 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"
)
  

Комментарии:

1. Ваш код почти сработал, но для неженатых и состоящих в браке пар вместо категории появилось «другое». Он успешно классифицировал отдельные домохозяйства. Я как-то неправильно реализую i?

2. Не могли бы вы поделиться строками из одной, hh_id которая таким образом классифицируется? Я бы ожидал, что их характеризуют таким образом либо потому, что в этом нет двух взрослых, hh_id либо их married статус ни single ни married . Или что-то еще, чего я сейчас не вижу.

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

4. Когда я загружаю образец данных, который я включил, а затем запускаю свой ответ, я получаю предоставленные мной выходные данные. 1) Когда вы делаете это, получаете ли вы «другое» для первых двух домохозяйств? 2) Какую версию dplyr вы используете? Я бы не подумал, что в последнее время в написанном мной коде произойдут кардинальные изменения, которые заставят его работать по-другому для вас, но я не знаю, что еще могло бы это сделать…

5. Для КАЖДОГО hh_id должна быть только ОДНА категория, что, я полагаю, вы и сделали. Я не уверен, как воспроизвести данные выборки, но я заметил, что у вас были символы, поэтому я изменил все свои факторы на символы для переменных gender и married. Все еще сталкивался с той же проблемой. Я использую версию 0.7.6