我有一个包含大约 150 万个人的数据集,可以通过“家庭 ID”在他们的家庭中进行区分。该数据集有一列(关系),根据家庭成员与户主的关系指定家庭成员之间的关系。
library(tidyverse)
sample <- tibble(
household.ID = c(11015015988, 11015015988, 11015015988 , 11015015988 , 11015015988,
11015015988, 11015015988, 11015015988 ),
member.ID= c(1101502683 ,11015026954,11015027098,11015027231 ,11015027353,11015027484
,11015027615 ,11015027751),
relationship = c(1,2,3,3,3,3,2,3),
gender = c(1,2,1,2,1,1,2,2),
age = c(54,54,30,26,23,31,20,2),
marriage.status= c(1,1,4,4,4,1,1,NA),
children.ever.born= c(NA,8,NA,NA,NA,NA,1,NA),
living.children = c(NA,8,NA,NA,NA,NA,1,NA))
“代码1”指的是户主; “代号2”是团长的妻子; “code 3”是head的孩子;因此,家庭中任何具有“代码2”的人都是“代码3”的母亲。我需要以这样的方式链接“代码 2”和“代码 3”:在每个家庭 ID 中,对于关系值为 3 的关系值,标识来自关系值为 2 的同一家庭的成员 ID。使用代码(由 @JonSpring 编写)我有能力做到。
sample2 <- select(sample, 1:8)
spouse_links <- left_join(relationship = "many-to-many",
sample2 %>% filter(relationship == 3),
sample2 %>% filter(relationship == 2, !is.na(living.children)) %>%
rename(member.ID.mother = member.ID), join_by(household.ID)) %>%
filter(!is.na(relationship.y)) %>%
select(1:8, member.ID.mother)
但是,我对一夫多妻制(与多个配偶结婚的做法)为习俗的家庭有疑问。在这样的家庭中,我们在关系栏中会遇到两个或多个“代码2”;结果,R 代码将所有“代码 3”链接到“代码 2”。为了澄清这一点,请考虑下表:
根据该表,我们可以发现孩子与母亲的联系是基于家庭中的亲疏程度。例如,第 2 行是第 3、4、5 和 6 行中子项的母亲,第 7 行是第 8 行的母亲。我需要访问如下表:
但是,上述准则对于一夫多妻制习俗的家庭并不适用。我非常感谢您能提供的任何帮助。
可能有一种更优雅的方法来解决此问题,但您可以使用
cumsum(sample$relationship == 2)
创建按家庭内部划分价值观的指标。
在
dplyr
管道中,这可以应用于将每个组拆分为一个列表(通过 group_split
),然后使用 map
创建 mother.member.ID
变量:
sample %>%
mutate(row = row_number(),
.by = household.ID) %>%
filter(relationship != 1) %>%
group_split(grp = cumsum(relationship == 2)) %>%
map(~mutate(., mother.member.ID = member.ID[relationship == 2]) %>%
filter(relationship == 3)) %>%
bind_rows() %>% select(-grp)
# household.ID member.ID relationship gender age marriage.status children.ever.born living.children row mother.member.ID
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <int> <dbl>
#1 11015015988 11015027098 3 1 30 4 NA NA 3 11015026954
#2 11015015988 11015027231 3 2 26 4 NA NA 4 11015026954
#3 11015015988 11015027353 3 1 23 4 NA NA 5 11015026954
#4 11015015988 11015027484 3 1 31 1 NA NA 6 11015026954
#5 11015015988 11015027751 3 2 2 NA NA NA 8 11015027615