在R中解决多配偶家庭的成员亲属关系精准匹配问题
解决一夫多妻家庭中子女与母亲的精准匹配问题
针对你150万条记录的数据集,要解决一夫多妻家庭里子女和对应母亲的匹配问题,我们可以结合行邻近性、年龄差和living.children字段实现精准匹配,具体方案如下:
核心思路
- 按家庭分组后,基于行顺序给每个成员标记所属的"母亲组":每个配偶(
relationship=2)对应其之后直到下一个配偶出现前的所有子女(relationship=3)。 - 用年龄差过滤不符合逻辑的匹配(母亲年龄需比子女至少大15岁,确保生育合理性)。
- 结合
living.children字段验证匹配数量,避免超出母亲实际存活子女数。
实现代码
library(tidyverse) # 加载示例数据 sample <- tibble( household.ID = c(11015015988, 11015015988, 11015015988 , 11015015988 , 11015015988, 11015015988, 11015015988, 11015015988,228979641, 228979641, 228979641 ,228979641), member.ID= c(1101502683 ,11015026954,11015027098,11015027231 ,11015027353,11015027484 ,11015027615 ,11015027751,228992311,228996137,229001877,229005869), relationship = c(1,2,3,3,3,3,2,3,1,3,2,2), gender = c(1,2,1,2,1,1,2,2,1, 2, 2 , 2), age = c(54,54,30,26,23,31,20,2, 60,12,34,62), marriage.status= c(1,1,4,4,4,1,1,NA, 1, 4, 1,1), children.ever.born= c(NA,8,NA,NA,NA,NA,1,NA,NA,NA,1,1), living.children = c(NA,8,NA,NA,NA,NA,1,NA,NA,NA,1,1) ) # 精准匹配子女与母亲 matched_data <- sample %>% group_by(household.ID) %>% # 生成母亲组标记:每遇到一个配偶就新建组,子女继承最近的配偶组 mutate(mother_group = cumsum(relationship == 2)) %>% # 筛选配偶和子女数据 filter(relationship %in% c(2,3)) %>% group_by(household.ID, mother_group) %>% # 提取当前组内的母亲信息 mutate( member.ID.mother = first(member.ID[relationship == 2]), mother_age = first(age[relationship == 2]), mother_living_children = first(living.children[relationship == 2]) ) %>% # 仅保留子女记录 filter(relationship == 3) %>% # 过滤年龄差不合理的匹配(母亲至少比子女大15岁) filter(age <= mother_age - 15) %>% # 限制匹配子女数不超过母亲的存活子女数 group_by(household.ID, member.ID.mother) %>% slice(1:mother_living_children) %>% # 保留需要的字段 select(household.ID, member.ID, relationship, gender, age, marriage.status, children.ever.born, living.children, member.ID.mother) %>% ungroup() # 查看匹配结果 print(matched_data)
代码细节说明
- 母亲组标记:通过
cumsum(relationship == 2)实现行邻近性匹配,确保每个子女归到最近的上一个配偶组。 - 年龄过滤:
age <= mother_age -15条件排除了生育逻辑不合理的匹配(比如示例中20岁母亲对应2岁子女符合要求,若出现年龄差小于15的情况会被过滤)。 - 数量限制:
slice(1:mother_living_children)保证每个母亲匹配的子女数不超过其living.children数值,避免过度匹配。
大数据集优化建议
针对150万条记录的规模,可做以下优化:
- 改用
data.table替代dplyr,大幅提升运算速度,逻辑可直接迁移。 - 先按
household.ID对数据集排序,确保行顺序的准确性(这是行邻近性匹配的核心前提)。 - 分批次处理数据,避免内存溢出。
内容的提问来源于stack exchange,提问作者Azam Mirzaei
相关产品推荐
相关产品推荐

