#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