如何合并多份R DataFrame并按日期与列名整合去重补全?
合并多DataFrame并补全缺失值的解决方案
方法1:用dplyr快速合并补全
这是最直观的处理方式,先绑定所有数据行,再按日期分组整合非NA值:
library(dplyr) # 绑定所有数据框的行 combined_df <- bind_rows(df1, df2, df3) # 按Date分组,对每列合并非NA值 final_df <- combined_df %>% group_by(Date) %>% summarise(across(-Date, ~coalesce(!!!.x)), .groups = "drop")
across(-Date, ~coalesce(!!!.x))会自动处理除Date外的所有列:同一日期下,不管有多少行,只保留第一个非NA值,自动补全缺失数据。
如果你的数据里只有个别国家列,也可以手动指定,比如只处理USA列:
final_df <- combined_df %>% group_by(Date) %>% summarise(USA = coalesce(!!!syms("USA")), .groups = "drop")
方法2:用data.table高效处理(适合大数据)
如果数据量很大,data.table的性能更优:
library(data.table) # 转换为data.table并合并 dt_list <- lapply(list(df1, df2, df3), as.data.table) combined_dt <- rbindlist(dt_list) # 按Date分组,提取每列的非NA值 final_dt <- combined_dt[, lapply(.SD, function(x) na.omit(x)[1]), by = Date]
na.omit(x)[1]会去掉当前列的NA值,取第一个有效数据,实现缺失补全。
方法3:修复你之前merge后的结果
如果你已经用方案2得到带.x/.y后缀的df,可以手动合并这些重复列:
# 提取所有国家列的前缀(比如从USA.x、USA.y里拿到USA) country_cols <- unique(sub("\\.(x|y)$", "", colnames(dfall2)[colnames(dfall2) != "Date"])) # 逐个合并后缀列并删除冗余列 for (col in country_cols) { dfall2[[col]] <- coalesce(dfall2[[paste0(col, ".x")]], dfall2[[paste0(col, ".y")]]) dfall2[, paste0(col, c(".x", ".y")) := NULL] }
最终效果验证
处理后的DataFrame会满足:
- Date列无重复,覆盖所有df的日期区间
- 每个国家仅保留一列,缺失日期对应的数据被其他df的有效值补全
- 没有冗余的重复行或带后缀的列
内容的提问来源于stack exchange,提问作者Drop
相关产品推荐
相关产品推荐

