как классифицировать группы на основе людей, которые их составляют?

#r #classification

Вопрос:

Вот моя проблема : у меня есть база данных людей (по 1 человеку в строке). Каждый человек принадлежит к домашнему хозяйству (указывается переменной ID_household ) и имеет определенный возраст (переменная age ). Что я хочу сделать, так это создать новый столбец type , который определяет тип домохозяйства на основе состава лиц, входящих в одно и то же домохозяйство :

  • Если есть 2 взрослых (два человека старше 18 лет), переменная типа принимает значение «пара». ;
  • Если есть 1 взрослый и по крайней мере 1 несовершеннолетний с минимальной разницей в возрасте 15 лет = «семья с одним родителем» ;
  • Если есть 2 взрослых и по крайней мере 1 несовершеннолетний с минимальной разницей в возрасте 15 лет = «пара с детьми» ;
  • Если есть один человек = «один человек».

Вот скрипт для импорта данных. ID_household и age являются исходными столбцами. type это столбец, который я хочу создать, но я не знаю, как это сделать :

 data lt;- data.frame(ID_household = c(1, 1, 2, 3, 3, 4, 5, 6, 6, 6, 7, 8, 8, 8, 8, 9, 9, 10, 11, 11, 11, 11),  age = c(31, 29, 36, 24, 34, 42, 19, 39, 6, 9, 42, 4, 6, 29, 34, 41, 12, 51, 26, 27, 1, 3),  type = c("couple", "couple", "single person", "couple", "couple", "single person", "single person",  "single parent family", "single parent family", "single parent family", "single person",  "couple with children", "couple with children", "couple with children", "couple with children",   "single parent family", "single parent family", "single person", "couple with children",  "couple with children", "couple with children", "couple with children"))  data  ID_household age type 1 1 31 couple 2 1 29 couple 3 2 36 single person 4 3 24 couple 5 3 34 couple 6 4 42 single person 7 5 19 single person 8 6 39 single parent family 9 6 6 single parent family 10 6 9 single parent family 11 7 42 single person 12 8 4 couple with children 13 8 6 couple with children 14 8 29 couple with children 15 8 34 couple with children 16 9 41 single parent family 17 9 12 single parent family 18 10 51 single person 19 11 26 couple with children 20 11 27 couple with children 21 11 1 couple with children 22 11 3 couple with children  

Ответ №1:

Я бы сделал это, создав переменные, касающиеся детей, взрослых и различий в возрасте, и используя case_when() их . В приведенном ниже коде я делаю type2 сравнение с type переменной в вашем наборе данных:

 data lt;- data %gt;%   group_by(ID_household) %gt;%   mutate(n_adult = sum(age gt; 18),   n_kids = sum(age lt;= 18),  min_adult_age = min(age[which(age gt; 18)]),   max_kid_age = ifelse(n_kids gt; 0, max(age[which(age lt;= 18)]), 0),   age_diff = min_adult_age - max_kid_age,   type2 = case_when(  n_adult == 2 amp; n_kids gt; 0 amp; age_diff gt;= 15 ~ "couple with children",   n_adult == 1 amp; n_kids gt; 0 amp; age_diff gt;= 15 ~ "single parent family",   n_adult == 2 amp; n_kids == 0 ~ "couple",  n_adult == 1 amp; n_kids == 0 ~ "single person",   TRUE ~ NA_character_)) %gt;%   select(-(n_adult:age_diff))  all(data$type == data$type2)  #[1] TRUE   

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

1. Я не видел, как это сделать с dplyr, но на самом деле это возможно, очень изобретательно! Большое спасибо!

Ответ №2:

Вот базовый способ R с ave .

 type lt;- with(data, ave(age, ID_household, FUN = (x){  if(length(x) lt; 2) {  "single person"  } else if(length(x) == 2L amp;amp; all(x gt;= 18)) {  "couple"  } else if(sum(x gt;= 18) == 1){  "single parent family"  } else "couple with children" }))  identical(data$type, type) #[1] TRUE