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
相关产品推荐
相关产品推荐

