2016-04-15 28 views
2

我有一个xts对象,其列数不断变化,但始终是相同的索引。我想根据每个系列的第一个元素得到一个百分比指数。R 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

你可以用apply做到这一点,我宁愿applysapply因为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是一个简单的数字向量。这也使得通过使用as.xts更容易将apply的输出强制回到xts对象。

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