如何在R中以一对多方式合并数据集并填充家庭变量的NA值?
问题:用家庭面板数据填充个体面板的缺失家庭变量
数据集A(个体面板数据)
| person_id | fam_id | year | personvar1 | personvar2 | familyvar1 | familyvar 2 |
|---|---|---|---|---|---|---|
| 1 | 50 | 2012 | 500 | stringA | 1000 | stringW |
| 2 | 50 | 2012 | 550 | stringB | 1000 | stringW |
| 3 | 60 | 2012 | 710 | stringC | 150 | stringX |
| 4 | 70 | 2012 | 800 | stringC | 200 | stringY |
| 5 | 70 | 2012 | 0 | stringJ | 200 | stringY |
| 1 | 50 | 2013 | 120 | stringJ | NA | NA |
| 2 | 50 | 2013 | 370 | stringK | NA | NA |
| 3 | 60 | 2013 | 80 | stringL | NA | NA |
| 1 | 50 | 2014 | 100 | stringM | NA | NA |
| 2 | 50 | 2014 | 500 | stringM | NA | NA |
| 3 | 60 | 2014 | 300 | stringO | NA | NA |
数据集B(2013年家庭面板数据)
| fam_id | year | familyvar1 | familyvar2 |
|---|---|---|---|
| 50 | 2013 | 400 | stringW |
| 60 | 2013 | 700 | stringY |
| 70 | 2013 | 1000 | stringZ |
需求
用数据集B中的对应值填充数据集A中2013年家庭变量(familyvar1、familyvar2)的NA值。
错误原因分析
你之前的merge代码错误地将家庭变量加入by参数,而数据集A中2013年的这些变量是NA,无法与数据集B的有效值匹配,导致合并后生成更多NA。
解决方案
方法1:基础R实现
先通过fam_id和year合并数据集,再条件替换NA值:
# 仅按家庭ID和年份合并,保留A的所有行 merged_A <- merge(A, B, by = c("fam_id", "year"), all.x = TRUE) # 替换2013年familyvar1的NA值 merged_A$familyvar1.x[merged_A$year == 2013 & is.na(merged_A$familyvar1.x)] <- merged_A$familyvar1.y[merged_A$year == 2013 & is.na(merged_A$familyvar1.x)] # 替换2013年familyvar2的NA值(注意A中列名带空格,需用反引号包裹) merged_A$`familyvar 2`[merged_A$year == 2013 & is.na(merged_A$`familyvar 2`)] <- merged_A$familyvar2[merged_A$year == 2013 & is.na(merged_A$`familyvar 2`)] # 清理多余列并修正列名 final_A <- merged_A[, c("person_id", "fam_id", "year", "personvar1", "personvar2", "familyvar1.x", "familyvar 2")] names(final_A)[names(final_A) == "familyvar1.x"] <- "familyvar1"
方法2:data.table高效处理(推荐)
用data.table的连接更新语法,直接在原数据集上修改,操作更简洁:
library(data.table) # 转换为data.table格式 setDT(A) setDT(B) # 按fam_id和year匹配,仅替换A中2013年的家庭变量NA值 A[B, on = .(fam_id, year), `:=`( familyvar1 = fifelse(is.na(familyvar1), i.familyvar1, familyvar1), `familyvar 2` = fifelse(is.na(`familyvar 2`), i.familyvar2, `familyvar 2`) )]
fifelse函数会判断:如果A的家庭变量是NA,则用B的对应值替换,否则保留原值。
注意事项
- 数据集A中
familyvar 2列名带空格,代码中必须用反引号`包裹,避免语法错误。 - 若2014年的家庭变量也需填充,只需补充对应年份的家庭面板数据,重复上述逻辑即可。
内容的提问来源于stack exchange,提问作者llb1706
相关产品推荐
相关产品推荐

