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

R语言按日期整合DataFrame,填充对应NA值技术求助

R语言中用df1填充df2对应日期的NA值

核心需求

用df1中对应日期的非NA值,填充df2中相同日期、相同列的NA值,最终保留df2的所有行和列(包括df1没有的列)。


示例数据解决方案

基于你提供的df1和df2示例数据,给出两种实现方法:

方法1:tidyverse生态(推荐,适合大规模数据)

借助dplyr和tidyr的coalesce函数,批量高效处理列填充:

library(dplyr)
library(tidyr)

# 自动识别df1和df2的共同列(排除日期列)
common_cols <- intersect(names(df1), names(df2))[-which(names(df1) == "Date")]

# 合并数据并填充NA
merged_df <- df2 %>%
  left_join(df1, by = "Date", suffix = c("_df2", "_df1")) %>%
  # 对所有共同列,用df1的值覆盖df2的NA
  mutate(across(all_of(common_cols), ~coalesce(.x, get(paste0(cur_column(), "_df1"))))) %>%
  # 还原为原df2的列结构
  select(names(df2))

方法2:Base R(无需额外包)

如果不想加载第三方包,用原生循环实现:

# 获取共同列(排除日期列)
common_cols <- intersect(names(df1), names(df2))[-which(names(df1) == "Date")]

# 遍历每一列填充NA
for(col in common_cols){
  # 定位df2中该列的NA行
  na_idx <- is.na(df2[[col]])
  # 匹配df1中对应日期的数值
  matched_vals <- df1[[col]][match(df2$Date[na_idx], df1$Date)]
  # 填充df2的NA
  df2[[col]][na_idx] <- matched_vals
}

实际数据集适配

你的真实数据需要先处理两个关键问题:

  1. 日期列名不一致:Augsburg的日期列是Augsburg_Date,Berlin_total是Date,先统一列名:
# 重命名Augsburg的日期列
Augsburg <- rename(Augsburg, Date = Augsburg_Date)
  1. 列类型不匹配:Augsburg的数值列是字符型(如"102.25"),需转为数值型才能正常填充:
# 将非日期列转换为数值型
Augsburg <- Augsburg %>%
  mutate(across(-Date, ~as.numeric(.x)))

Berlin_total <- Berlin_total %>%
  mutate(across(-Date, ~as.numeric(.x)))

完成上述处理后,直接套用前面的示例方法即可完成填充整合。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 04:40:25