R xts计算多个系列的百分比指数

时间:2016-04-15 10:36:45

标签: r xts

我有一个xts对象,其列数不断变化但总是相同的索引。我想根据每个系列的第一个元素得到百分比指数。

例如一个列:

library(xts)

x <- xts(1:10,as.Date("2012-12-21")+1:10)
x

z<-(x / drop(coredata(first(x, 1))))*100
z

如果可以更改列数,是否有办法在每列上运行此计算?

2 个答案:

答案 0 :(得分:2)

您可以使用apply执行此操作,我希望apply优先于sapply,因为apply强制其第一个参数为矩阵。这简化了操作每列所需的功能。

我将使用tonytonov's answer中的相同x

R> x <- xts(matrix(1:20, ncol = 2),as.Date("2012-12-21") + 1:10)
R> as.xts(apply(x, 2, function(v) 100*v/v[1]))
           [,1]     [,2]
2012-12-22  100 100.0000
2012-12-23  200 109.0909
2012-12-24  300 118.1818
2012-12-25  400 127.2727
2012-12-26  500 136.3636
2012-12-27  600 145.4545
2012-12-28  700 154.5455
2012-12-29  800 163.6364
2012-12-30  900 172.7273
2012-12-31 1000 181.8182

请注意,您不需要拨打coredatadrop,因为apply首先将x强制转换为矩阵(通过调用as.matrix.xts)。这意味着v是一个简单的数字向量。这也可以使用apply更轻松地将as.xts的输出强制转换回xts对象。

答案 1 :(得分:1)

给出类似

的系列
x <- xts(matrix(1:20, ncol = 2),as.Date("2012-12-21") + 1:10)

可以使用例如sapply喜欢这样:

xts(sapply(x, function(y) 100 * y / as.numeric(y[1, ])), index(x))
            x.1   x.2
2012-12-22  100 100.0
2012-12-23  200 109.1
2012-12-24  300 118.2
2012-12-25  400 127.3
2012-12-26  500 136.4
2012-12-27  600 145.5
2012-12-28  700 154.5
2012-12-29  800 163.6
2012-12-30  900 172.7
2012-12-31 1000 181.8