将xts除以另一个xts并在此过程中创建新的xts

时间:2018-04-19 09:18:59

标签: r xts

我希望将两个xts对象相互分开。每个xts具有相同数量的列(具有相同的列名称)但行数不同。我希望我的代码在其他xts中找到它各自的列并找到相应的日期值并除以它们然后将新输出放在具有相同列的新xts中。

例如:

xts 1

Date         V1     V2
2017-07-21   4.5    NA
2017-09-15   NA     2.5

xts 2

Date         V1     V2
2017-06-15  12.9   10.7
2017-07-21   6.7    2.2
2017-08-13   7.9    8.3
2017-09-15   4.5    3.2

新xts

Date         V1     V2
2017-07-21  0.67    NA
2017-09-15   NA    1.28

2 个答案:

答案 0 :(得分:1)

我认为xts库实际上是一个非常神奇的工具,它会自动执行

> xts1 <- structure(c(4.5, NA, NA, 2.5), .Dim = c(2L, 2L),
   .Dimnames = list(NULL, c("V1", "V2")),
   index = structure(c(1500595200, 1505433600), tzone = "UTC", tclass = "Date"),
   class = c("xts", "zoo"), .indexCLASS = "Date", tclass = "Date",
   .indexTZ = "UTC", tzone = "UTC")
> xts2 <- structure(c(12.9, 6.7, 7.9, 4.5, 10.7, 2.2, 8.3, 3.2),
   .Dim = c(4L, 2L), .Dimnames = list(NULL, c("V1", "V2")),
   index = structure(c(1497484800, 1500595200, 1502582400, 1505433600),
       tzone = "UTC", tclass = "Date"),
   class = c("xts", "zoo"), .indexCLASS = "Date", tclass = "Date",
   .indexTZ = "UTC", tzone = "UTC")
> xts1 / xts2
                  V1      V2
2017-07-21 0.6716418      NA
2017-09-15        NA 0.78125

算术运算会在做任何事情之前尊重日期并匹配它们。

希望有所帮助

答案 1 :(得分:0)

以下是apply的解决方案:

> t(apply(xts1, 1, function(d)as.numeric(xts1[d[1],c('V1', 'V2')])/as.numeric(xts2[d[1],c('V1', 'V2')])))
                [,1]    [,2]
2017-07-21 0.6716418      NA
2017-09-15        NA 0.78125