Создание новой переменной, которая указывает конкретное условие, с использованием двух ранее существующих переменных в кадре данных. - PullRequest
0 голосов
/ 02 июля 2018

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

id     if_adult (>18 yrs old)     marital_status
1          1                       Single
1          1                       Single
2          1                       Married
2          1                       Married
2          0                       Married

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

individual_data$`unmarried couple` <- ifelse((individual_data$if_adult == 
"1" & individual_data$id == individual_data$id) & 
individual_data$marital_status == "Single", "1","0")

Но это неверно классифицирует домохозяйства, возглавляемые одинокими людьми (то есть одинокие мамы и одинокие папы с детьми), как не состоящие в браке пары. Это ключевой момент - если я смогу это выяснить, это будет точно. Чтобы исправить эту проблему, я пытаюсь создать новую переменную, которая будет указывать общее количество взрослых в семье:

id     if_adult (>18 yrs old)     marital_status   total_adults
1          1                       Single          2
1          1                       Single          2
2          1                       Married         2
2          1                       Married         2
2          0                       Married         2

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

individual_data$`unmarried couple` <- ifelse((individual_data$total_adults 
== 2 & individual_data$id == individual_data$id) & 
individual_data$marital_status == "Single", "1","0")

В конечном итоге я хочу, чтобы это выглядело так и для остальных данных:

id     if_adult     marital_status   total_adults  unmarried couple  
1          1           Single          2             1
1          1           Single          2             1
2          1           Married         2             0    
2          1           Married         2             0
2          0           Married         2             0

Заранее спасибо за отзывы и предложения

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

=== правки в конце ===

Если вы хотите придерживаться Base R, вам может подойти следующее решение:

individual_data$unmarried_couples <- ifelse(individual_data$marital_status %in% c("Single", "1", "0"),
    individual_data$total_adults %/% 2,
    0)

Я использовал выражение total_adults %/% 2 для расчета количества не состоящих в браке пар, живущих в домашнем хозяйстве, поскольку я думал, что в этом случае в домашнем хозяйстве проживают более двух одиноких взрослых.

Проверено на:

id     if_adult (>18 yrs old)     marital_status   total_adults
1          1                       Single          2
1          1                       Single          2
2          1                       Married         2
2          1                       Married         2
2          0                       Married         2

=== редактирует ==
Так как вы боретесь с переменной adults_in_household, вот полностью воспроизводимый код:

individual_data <-  data.frame(
  id = c(1,1,2,2,2,3,3),
  if_adult = c(1,1,1,1,0,0,0),
  marital_status = c("Single", "Single", "Married", "Married", "Married", "Single", "Single")
)

library(dplyr)

individual_data %>% 
  group_by(id) %>% 
  mutate(adults_in_household = sum(if_adult))

Вывод этого кода должен быть:

# A tibble: 7 x 4
# Groups:   id [3]
     id if_adult marital_status adults_in_household
  <dbl>    <dbl> <fct>                        <dbl>
1     1        1 Single                           2
2     1        1 Single                           2
3     2        1 Married                          2
4     2        1 Married                          2
5     2        0 Married                          2
6     3        0 Single                           0
7     3        0 Single                           0

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

0 голосов
/ 02 июля 2018

Как насчет этого, используя dplyr и group_by, чтобы сделать это немного проще. Проверяется, чтобы убедиться, что для каждого идентификатора есть ровно два взрослых.

library(dplyr)
dd %>% 
  group_by(id) %>% 
  mutate(unmarried_couple = sum(if_adult*(marital_status=="Single"))==2,
    total_adults = sum(if_adult))

протестировано с

dd <- read.table(text="id     if_adult     marital_status
1          1                       Single
1          1                       Single
2          1                       Married
2          1                       Married
2          0                       Married", header=T)
...