2016-04-15 16 views
2

Ich habe ein xts Objekt mit einer Anzahl von Spalten ändern, aber immer den gleichen Index. Ich möchte einen prozentualen Index basierend auf dem ersten Element jeder Serie erhalten.R XTS auf mehreren Reihen Prozentindex Berechnung

Zum Beispiel mit einem Säule:

library(xts) 

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

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

Gibt es eine Möglichkeit, diese Berechnung auf jeder Spalte ausgeführt werden, wenn die Anzahl der Spalten kann geändert werden?

Antwort

2

Sie können dies mit apply tun, und ich würde apply über sapply bevorzugen, weil apply zu einer Matrix erstes Argument nötigt. Und das vereinfacht die Funktion, die für jede Spalte benötigt wird.

Ich werde die gleiche x von tonytonov's answer verwenden.

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 

Beachten Sie, dass Sie nicht brauchen, die Anrufe zu coredata oder drop weil applyx zuerst an eine Matrix coerces (durch as.matrix.xts Aufruf). Das bedeutet v ist ein einfacher numerischer Vektor. Dies macht es auch leichter, durch die Verwendung as.xts die Ausgabe von apply zurück zu einem xts Objekt zu zwingen.

1

eine Reihe wie

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

ein Beispiel verwenden können sapply wie so:

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