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

如何合并多份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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 05:20:01