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 }
实际数据集适配
你的真实数据需要先处理两个关键问题:
- 日期列名不一致:
Augsburg的日期列是Augsburg_Date,Berlin_total是Date,先统一列名:
# 重命名Augsburg的日期列 Augsburg <- rename(Augsburg, Date = Augsburg_Date)
- 列类型不匹配:
Augsburg的数值列是字符型(如"102.25"),需转为数值型才能正常填充:
# 将非日期列转换为数值型 Augsburg <- Augsburg %>% mutate(across(-Date, ~as.numeric(.x))) Berlin_total <- Berlin_total %>% mutate(across(-Date, ~as.numeric(.x)))
完成上述处理后,直接套用前面的示例方法即可完成填充整合。
内容的提问来源于stack exchange,提问作者Sulz
相关产品推荐
相关产品推荐

