2016-04-15 4 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, и я предпочел бы apply над sapply потому apply принуждают свой первый аргумент в матрицу. И это упрощает функцию, необходимую для работы с каждым столбцом.

Я буду использовать то же самое x от tonytonov's answer.

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 

Обратите внимание, что вам не нужно вызовы coredata или drop потому apply принуждают x в матрицу первого (по телефону as.matrix.xts). Это означает, что v - простой числовой вектор. Это также упрощает принуждение вывода apply к объекту xts с помощью as.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 
Смежные вопросы