如何将两个xts对象按对应日期与列相除并生成新xts对象
解决xts对象按日期和列名匹配的除法运算问题
没问题,我来帮你搞定这个需求!要实现两个列名一致但行数不同的xts对象按相同日期+对应列做除法,核心思路是先把两个对象按日期对齐合并,再逐列执行除法操作,最后整理成目标格式的xts对象。
步骤1:构造示例数据
先把你给出的示例数据用R代码还原出来,方便后续测试:
library(xts) # 构造xts1 xts1_data <- data.frame( V1 = c(4.5, NA), V2 = c(NA, 2.5) ) xts1 <- xts(xts1_data, order.by = as.Date(c("2017-07-21", "2017-09-15"))) # 构造xts2 xts2_data <- data.frame( V1 = c(12.9, 6.7, 7.9, 4.5), V2 = c(10.7, 2.2, 8.3, 3.2) ) xts2 <- xts(xts2_data, order.by = as.Date(c("2017-06-15", "2017-07-21", "2017-08-13", "2017-09-15")))
步骤2:合并对齐日期并执行除法
我们可以先使用merge()函数将两个xts对象按日期合并,这样相同日期的行会自动对齐,然后对每一列执行除法运算:
# 合并两个xts,添加后缀区分原对象 merged_xts <- merge(xts1, xts2, suffixes = c("_xts1", "_xts2")) # 逐列计算除法,生成新的xts对象 result_xts <- xts( x = lapply(colnames(xts1), function(col) { merged_xts[, paste0(col, "_xts1")] / merged_xts[, paste0(col, "_xts2")] }), order.by = index(merged_xts) ) # 设置列名和原对象一致 colnames(result_xts) <- colnames(xts1) # 可选:如果只保留两个对象都存在的日期(去掉只有一个对象有数据的行) result_xts_clean <- na.omit(result_xts)
运行结果展示
执行上述代码后,result_xts的内容如下:
V1 V2 2017-06-15 NA NA 2017-07-21 0.6716418 NA 2017-08-13 NA NA 2017-09-15 NA 0.7812500
而result_xts_clean会只保留两个对象都有对应数据的行:
V1 V2 2017-07-21 0.6716418 NA 2017-09-15 NA 0.7812500
补充说明
- 这个方法自动适配任意数量的列,只要两个xts对象的列名完全一致就可以正常运行
- 除法运算中如果遇到
NA(比如某一行其中一个对象没有数据),结果会保留NA,你可以根据需求用na.fill()等函数进一步处理 - 如果希望只保留两个对象共同存在的日期,直接用
na.omit()过滤即可
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

