Сколько значений в одном столбце отображается в другом R

#r #dplyr #survey

Вопрос:

Я работаю с данными опроса и хотел бы подсчитать, сколько детей у каждого человека в домохозяйстве. Набор данных выглядит следующим образом https://github.com/aquijanoruiz/disability_benefits_EC/raw/master/rds_files/survey_data.rds

В столбце «человек» перечислены люди, проживающие в домохозяйстве. Столбцы «мать» и «отец» указывают, кто является матерью/отцом человека. Например, в первом доме (обозначенном переменной houlsehold_id 010150000201011) перон 1 и 2 являются матерью и отцом человека 3, 4, 5 и 6 соответственно.

Я хочу сгенерировать переменную, указывающую количество детей у каждого человека в семье. Для первого домашнего хозяйства это должно быть 4, 4, 0, 0, 0, 0.

Я думал об children %>% group_by(household_id) %>% mutate(n_chid = sum(person %in% mother, na.rm = TRUE)) этом, но они не сработают. Есть какие-нибудь идеи? Спасибо! введите описание изображения здесь

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

1. @akrun спасибо! почему мы должны группироваться по возрасту? Я думаю, что переменная возраста не имеет значения для расчета, я просто оставил ее там, чтобы понять, кто чья мать/отец.

2. Спасибо. Я вижу замешательство. Позвольте мне уточнить. Первые двое-мать и отец следующих четырех человек, поэтому у обоих по 4 ребенка. Их возраст-28 лет-это просто совпадение. Например, для лица 3 (которому 13 лет) мать-это лицо 2, а отец-лицо 1. Я подумал о person %in% mother том, что, поскольку это приведет к НА-НА-ИСТИНЕ, ИСТИННОЙ ИСТИНЕ, я мог бы суммировать истины и получить 4. Надеюсь, это все объясняет более ясно.

3. Я просто скачал его и использовал команду children <-readRDS("survey_data.rds") , и она сработала.

4. Я использовал load по умолчанию

Ответ №1:

Возможно, нам придется перебирать каждого «человека»

 library(dplyr)
library(purrr)
children %>% 
     group_by(household_id) %>%
     mutate(n_chid = map_dbl(person, ~ sum(mother %in% .x, na.rm = TRUE)))
 

Используя код операции с person %in% mother более чем полной группой, он возвращает тот же логический вывод, что и все строки группы. Вместо этого нам нужно ограничить его одним наблюдением за раз

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

1. Спасибо, это сработало. Да, нам пришлось ограничиться одним наблюдением за раз, и я не знал, как это сделать.

2. @AlonsoQuijano конечно, вы можете изменить map_dbl на sapply(person, (x) sum(mother %in% x, na.rm = TRUE))

3. @AlonsoQuijano только с базой R, возможно, нам понадобится split , т. е. unsplit(lapply(split(children, children$household_id), (x) {x$n_chid <- with(x, sapply(person, (y) sum(mother %in% y, na.rm = TRUE)); x}), children$household_id)

4. Большое спасибо. Я менее знаком с пакетом purrr, поэтому я хотел использовать функцию sapply. Однако мне пришлось (x) заменить function(x) его на, чтобы он работал. Еще раз большое спасибо!

5. @AlonsoQuijano (x) компактный вариант is от R 4.1.0 function(x) , если у вас более старая версия R, он может не работать