如何基于条件合并IPUMS微观数据中的重复行?
解决IPUMS三月样本CPS与ASEC数据合并问题
你的代码仅处理了MIGSTA1到MIGRATE1变量,完全没涉及TELWRKPAY、TELWRKHR、ASECWTH等其他需要合并的字段,所以这些变量最终全为NA。正确的思路是按受访者的唯一标识组合(CPSIDV、MONTH、YEAR)分组,对每个目标字段提取非NA有效值——每组内的两行数据中,每个目标字段只会在其中一行有值,另一行为NA。
方法一:逐个指定字段合并
library(dplyr) merged_data <- all_ft %>% # 按受访者唯一标识分组 group_by(CPSIDV, MONTH, YEAR) %>% summarise( # 提取每个字段的非NA有效值 ASECWTH = first(na.omit(ASECWTH)), ASECWT = first(na.omit(ASECWT)), TELWRKPAY = first(na.omit(TELWRKPAY)), TELWRKHR = first(na.omit(TELWRKHR)), MIGSTA1 = first(na.omit(MIGSTA1)), MIGRATE1 = first(na.omit(MIGRATE1)), HWTFINL = first(na.omit(HWTFINL)), WTFINL = first(na.omit(WTFINL)), # 分组后自动取消分组 .groups = "drop" )
方法二:用across批量处理字段
如果需要合并的字段较多,用across更简洁高效:
merged_data <- all_ft %>% group_by(CPSIDV, MONTH, YEAR) %>% summarise( across( # 列出所有需要合并的目标字段 c(ASECWTH, ASECWT, TELWRKPAY, TELWRKHR, MIGSTA1, MIGRATE1, HWTFINL, WTFINL), # 提取每组内第一个非NA值(每组仅存在一个有效值) ~first(na.omit(.x)) ), .groups = "drop" )
注意事项
- 2022年之前的ASEC行中
TELWRKPAY和TELWRKHR本身即为NA,合并后这些样本的对应字段依然会是NA,属于正常数据情况,不影响后续分析。 - 若某个字段在组内两行均为NA(除上述正常情况外),合并结果也会是NA,需结合实际数据排查原因。
内容的提问来源于stack exchange,提问作者user24690595
相关产品推荐
相关产品推荐

