存在部分共同列的多个xts时间序列对象合并方法咨询
XTS时间序列跨年度成分股合并解决方案
核心思路
利用xts对象的时间索引特性,先提取所有唯一股票代码,再按单只股票拼接不同时间段的价格数据,最后合并所有股票列,自动将不存在的时段数据补为NA。
实现代码
首先加载依赖包:
library(xts)
示例数据构造
# 2020年成分股数据 date1 <- as.Date(c("2020-11-01", "2020-12-01")) xts1 <- xts( data.frame( AAPL = c(100, 105), AMZ = c(85, 70), AA = c(90, 80), AXP = c(70, 90) ), order.by = date1 ) # 2021年调整后成分股数据 date2 <- as.Date(c("2021-01-01", "2021-02-01")) xts2 <- xts( data.frame( AAPL = c(108, 110), AM = c(75, 60), AXP = c(80, 70), BA = c(50, 60) ), order.by = date2 )
合并逻辑(支持2个及以上年度数据批量处理)
# 1. 把所有待合并的年度xts放入列表 xts_list <- list(xts1, xts2) # 2. 提取所有出现过的股票代码 all_tickers <- unique(unlist(lapply(xts_list, colnames))) # 3. 按单只股票拼接全时间段数据 merged_list <- lapply(all_tickers, function(ticker) { # 提取该股票在各年度的价格,没有则补对应时段的NA per_ticker <- lapply(xts_list, function(x) { if (ticker %in% colnames(x)) { return(x[, ticker]) } else { return(xts(rep(NA, nrow(x)), order.by = index(x))) } }) # 拼接该股票的全时段数据 do.call(rbind, per_ticker) }) # 4. 合并所有股票列得到最终结果 final_xts <- do.call(merge, merged_list) colnames(final_xts) <- all_tickers
输出结果验证
打印final_xts即可得到预期格式:
AAPL AMZ AA AXP BA 2020-11-01 100 85 90 70 NA 2020-12-01 105 70 80 90 NA 2021-01-01 108 NA NA 80 50 2021-02-01 110 NA NA 70 60
内容的提问来源于stack exchange,提问作者Tamás F
相关产品推荐
相关产品推荐

