2011-12-01 4 views
1

Я пытаюсь сравнить два временных ряда в R, чтобы оценить, насколько тесно они коррелируют, построив их на линейном графике. Чтобы избежать наличия двух отдельных осей для данных, я хочу сделать индекс каждого значения, чтобы построить изменения значений с даты X, построив индексы, а не необработанные данные.Создание индексов для двух значений временных рядов в R

данных выглядит следующим образом:

Table 1. 
Month A  B 
Jan  3883 151831 
Feb  3626 154070 
Mar  4346 163550 
Apr  3439 155674 

Желаемый результат выглядит следующим образом:

Table 2. 
Month A  A.index B  B.index 
Jan  3883 100  151831 100 
Feb  3626 93.38  154070 101.47 
Mar  4346 111.92 163550 107.71 
Apr  3439 88.56  155674 102.53 

я могу добиться этого в Excel путем экспорта таблицы 1, чтобы преуспеть и добавление столбца для A.index и B.index и используя расчет для определения изменения от номера индекса 100. Предполагая, что A находится в столбце B, тогда я просто:

=(cn)/c$2*100 

Где cn - столбец C строки n, c $ 2 - исходное значение, а 100 - номер индекса.

Однако, я хотел бы знать, как достичь того же в R, чтобы я мог обернуть его в функцию, так как это будет что-то, что мне нужно делать полу-регулярно.

Приветствия Том

ответ

4

Используя tranform(), это просто, как может быть. Ключевая строка на самом деле очень похожа на код Excel и должна быть понятной.

df <- read.table(text="Month A  B 
Jan  3883 151831 
Feb  3626 154070 
Mar  4346 163550 
Apr  3439 155674", header=T) 

df <- transform(df, A.index=100*A/A[1], B.index=100*B/B[1]) 
df 
# Month A  B A.index B.index 
# 1 Jan 3883 151831 100.00000 100.0000 
# 2 Feb 3626 154070 93.38141 101.4747 
# 3 Mar 4346 163550 111.92377 107.7185 
# 4 Apr 3439 155674 88.56554 102.5311 
+0

Работы очарование. Большое спасибо. –

2

Возможно, более масштабируемой/общее решение заключается в использовании функции apply() для перебора всех ваших колонок, независимо от того, сколько столбцов у вас есть:

x <- matrix(c(3883, 151831, 3626, 154070, 4346, 163550, 3439, 155674), 
      ncol = 2, byrow = TRUE, dimnames = list(NULL, c("A", "B"))) 

apply(x, 2, function(y) 100 * y/y[1]) 

      A  B 
[1,] 100.00000 100.0000 
[2,] 93.38141 101.4747 
[3,] 111.92377 107.7185 
[4,] 88.56554 102.5311 

Вы можете явно cbind() эту информацию обратно к вашим исходным данным, если это необходимо, или просто заговорите это напрямую.

Смежные вопросы