R语言跨数据框匹配按规则新增个体抚养子女数字段
错误原因
你原有代码的问题出在三个地方:
- 未做表关联直接用
==跨表匹配hh_id:两个数据框行数不一致时,这种比对会按位置循环匹配,完全无法实现按家庭ID对齐的需求,极易出现匹配错位。 - 逻辑判断优先级错误:R中
&运算优先级高于|,你写的判断条件实际等价于(hh_id匹配成功且身份是父亲) OR (身份是母亲),会导致所有母亲行无论是否匹配到家庭都会被赋值子女数。 - 列名书写错误:原数据身份列名为
Sit_in、第二张表子女数列名为Number_of_children,你代码中写的Set_in、nb_child和实际列名不匹配,会直接触发对象不存在的报错。
正确实现代码
使用dplyr的左连接按家庭ID匹配子女总数,再按规则赋值即可,逻辑清晰且不会出现匹配错位问题:
library(dplyr) # 核心处理逻辑 test1 <- test1 %>% left_join(test2, by = "hh_id") %>% mutate( nb_charge_of = case_when( Sit_in %in% c(1, 2) ~ Number_of_children, TRUE ~ 0 ) ) %>% # 不需要保留中间匹配的子女数字段可运行下行代码 select(-Number_of_children)
如果存在部分家庭在test2中没有对应子女数记录的情况,可以把判断逻辑补全避免出现NA:
nb_charge_of = case_when( Sit_in %in% c(1,2) & !is.na(Number_of_children) ~ Number_of_children, TRUE ~ 0 )
处理结果示例
以你描述的样例数据为例,处理后输出如下:
| hh_id | Sit_in | Age | nb_charge_of |
|---|---|---|---|
| 1 | 1 | - | 1 |
| 1 | 2 | - | 1 |
| 1 | 3 | - | 0 |
| 2 | 1 | - | 2 |
| 2 | 2 | - | 2 |
| 2 | 3 | - | 0 |
| 2 | 3 | - | 0 |
内容的提问来源于stack exchange,提问作者Majed
相关产品推荐
相关产品推荐

