#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.0function(x)
, если у вас более старая версия R, он может не работать