合并两个DataFrame时codi_CNAE列值重复问题求助
数据框合并后codi_CNAE重复的原因及解决办法
问题原因
从你提供的样本数据能看出两种导致重复的核心情况:
- NUMERO=5:
Despesa_2021_Red里同一个NUMERO对应3条不同codi_CNAE的支出记录,而Membres_2021_Red里该NUMERO只有1条成员记录,合并时会把这条成员信息和每条支出记录配对,造成成员字段重复。 - NUMERO=6:
Membres_2021_Red里同一个NUMERO对应3条不同成员的记录(对应户主、配偶、子女),而Despesa_2021_Red里该NUMERO只有1条支出记录,合并时会把这条支出信息和每个成员记录配对,造成codi_CNAE等支出字段重复。
本质是两个数据框中的NUMERO都不是唯一标识,不满足一对一合并的条件,合并时产生了笛卡尔积式的配对,最终导致重复。
解决步骤
1. 先排查原数据的重复情况
先确认两个数据框里每个NUMERO的出现次数,明确重复来源:
# 查看Despesa_2021_Red中每个NUMERO的记录数 table(Despesa_2021_Red$NUMERO) # 查看Membres_2021_Red中每个NUMERO的记录数 table(Membres_2021_Red$NUMERO)
2. 根据业务需求处理原数据后再合并
情况一:保留所有支出和成员的对应关系
如果业务需要展示每个成员与每笔支出的关联,当前合并结果是合理的;若觉得重复展示冗余,可以把成员信息转成宽格式:
library(tidyr) # 将成员信息转成宽格式,每个NUMERO对应一行 Membres_wide <- pivot_wider(Membres_2021_Red, id_cols = NUMERO, names_from = relacions, values_from = c(edat, sexe, estudis)) # 再与支出数据合并 despesa_membres <- merge(Despesa_2021_Red, Membres_wide, by="NUMERO", all=TRUE)
情况二:只保留每个NUMERO的汇总支出
如果Despesa_2021_Red的多条记录是同一NUMERO下的分项支出,先按NUMERO汇总:
# 按NUMERO和codi_CNAE汇总支出字段(保留不同支出类别) Despesa_sum <- aggregate(cbind(despesatotal, despesamonetaria) ~ NUMERO + codi_CNAE + grup_CNAE, data = Despesa_2021_Red, sum, na.rm = TRUE) # 若只需要主成员信息,先筛选户主记录 Membres_main <- subset(Membres_2021_Red, sustentador == 1) # 合并处理后的数据集 despesa_membres <- merge(Despesa_sum, Membres_main, by="NUMERO", all=TRUE)
情况三:每个NUMERO只保留一条成员记录
如果业务仅需要每个NUMERO对应的主成员信息,直接筛选后合并:
Membres_main <- subset(Membres_2021_Red, sustentador == 1) despesa_membres <- merge(Despesa_2021_Red, Membres_main, by="NUMERO", all=TRUE)
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

