2016-04-15 31 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