如何按日期合并行数不同的DataFrame列表?R语言解决方案
R合并含日期的DataFrame列表:补全缺失日期为NA
你可以通过**左连接(Left Join)**的方式,以列表中第一个完整日期的DataFrame为基础,依次和后续的子集合并,缺失日期对应的观测值会自动填充为NA。下面提供两种实现方式:
先整理示例数据(给列名重命名,方便后续操作)
首先给原始数据和子集的日期列统一命名,并给每个子集的观测列加上标识:
start_date <- as.Date("2017/01/01") # 完整日期表:指定列名为date original <- data.frame(date = seq(start_date, by = "day", length.out = 365)) set.seed(5) sub1 <- original[-sample(1:365, 100, replace=FALSE),] # 给子集的观测列命名为obs1 colnames(sub1) <- c("date", "obs1") set.seed(4) sub2 <- original[-sample(1:365, 30, replace=FALSE),] # 给子集的观测列命名为obs2 colnames(sub2) <- c("date", "obs2") # 构造目标列表 df_list <- list(original, sub1, sub2)
方法1:使用dplyr + purrr(简洁高效)
利用reduce函数依次对列表中的DataFrame做左连接:
library(dplyr) library(purrr) # 以完整日期表为基础,合并所有子集 merged_df <- df_list %>% reduce(left_join, by = "date")
方法2:Base R原生实现
通过循环逐个合并,无需额外加载包:
# 初始化合并结果为完整日期表 merged_df <- df_list[[1]] # 遍历列表中剩余的子集,逐个左连接 for (subset_df in df_list[-1]) { merged_df <- merge(merged_df, subset_df, by = "date", all.x = TRUE) }
验证结果
查看合并后的前几行数据,缺失的观测值会自动填充为NA:
head(merged_df)
内容的提问来源于stack exchange,提问作者Essi
相关产品推荐
相关产品推荐

