R语言如何按起始日期对齐合并列表中不同长度的时间序列
按时间轴对齐合并不等起始点的月度时间序列
我通过lapply函数得到一组时间序列输出,需要以每条序列自身的起始日期为基准,按统一时间轴对齐后通过类cbind逻辑合并。
测试数据构造代码如下,随机生成5条起始时间、序列长度均随机的月度时间序列:
set.seed(123) d <- lapply(1:5,function(x) ts(rnorm(runif(1,5,20),0,10),start = floor(c(runif(1,2019,2020),runif(1,1,12))),frequency = 12))
此前尝试过原生cbind、qpcR包的cbindna/cbind.na、data.frame构造、cbind2等多种方法均无法满足需求,手动写for循环填充空位的实现方式过于繁琐,期望的合并效果参考下图:
最简实现方法
直接使用zoo包的时间序列合并能力即可,无需手动编写循环做索引匹配和空位填充,核心逻辑是zoo对象原生支持按时间索引做对齐合并,缺失位置自动填充NA:
# 未安装zoo包先执行安装:install.packages("zoo") library(zoo) # 将list中所有ts对象转为zoo格式后,按时间索引批量cbind合并 merged_result <- do.call(cbind, lapply(d, as.zoo)) # 如果需要转回R原生ts格式,追加执行以下代码即可 merged_result <- as.ts(merged_result)
输出结果完全匹配预期:整体时间范围自动覆盖所有序列的最早起始点到最晚结束点,单条序列仅在自身存在的时间点位保留数值,其余无数据的点位自动填充NA。
内容的提问来源于stack exchange,提问作者Matthew Camilleri
相关产品推荐
相关产品推荐

