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

R语言合并含相同ID的两个dataframe时避免重复值的方法

实现方法

核心逻辑

DF2中同一个ID存在多条销售记录,直接按ID/ID+Town合并会导致DF1的行被重复匹配,要保证DF1的Name列无重复值,优先先对DF2按ID做聚合计算,得到每个ID唯一的统计结果后再与DF1合并,合并后每个ID仅对应1行,不会出现DF1字段重复的问题。

代码实现

基础R实现

# 1. 按ID和城市聚合销售数据,可根据需要调整计算指标(总销售额、交易次数、平均客单价等)
sales_agg <- aggregate(Amount ~ ID + Town, data = TownSales, FUN = function(x) {
  c(
    total_sales = sum(x),
    transaction_count = length(x),
    avg_amount = mean(x)
  )
})
# 展开聚合后的嵌套列
sales_agg <- do.call(data.frame, sales_agg)
# 2. 与Customer表合并,保留Customer所有行
merge_result <- merge(Customer, sales_agg, by = c("ID", "Town"), all.x = TRUE)

dplyr实现(更简洁常用)

library(dplyr)

merge_result <- TownSales %>%
  # 按ID和城市分组聚合销售指标
  group_by(ID, Town) %>%
  summarise(
    total_sales = sum(Amount),
    transaction_count = n(),
    avg_amount = mean(Amount),
    .groups = "drop"
  ) %>%
  # 关联Customer表,保留Customer所有行
  right_join(Customer, by = c("ID", "Town"))

特殊场景:需保留DF2明细仅展示时去重Name

如果业务需要保留DF2的所有销售明细行,仅在展示时不显示重复的Name字段,可以使用如下方法,注意该方法仅适合展示,不适合后续计算,计算时仍会存在重复值:

library(dplyr)

show_result <- TownSales %>%
  left_join(Customer, by = c("ID", "Town")) %>%
  group_by(ID) %>%
  mutate(Name = ifelse(row_number() == 1, Name, NA_character_)) %>%
  ungroup()

内容的提问来源于stack exchange,提问作者andrew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:15:01