You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合并两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 23:45:42