Создать индексы для двух значений временного ряда в R - PullRequest
1 голос
/ 01 декабря 2011

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

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

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 в Excel и добавив столбец для A.index и B.index ииспользуя вычисление для определения изменения индекса с номером 100. Предполагая, что A находится в столбце B, тогда я просто:

=(cn)/c$2*100

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

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

Ура Том

Ответы [ 3 ]

4 голосов
/ 01 декабря 2011

Используя 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
2 голосов
/ 01 декабря 2011

Возможно, более масштабируемым / общим решением является использование функции 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() вернуть эту информацию к исходным данным, если это необходимо, или просто построить ее напрямую.

0 голосов
/ 14 февраля 2019

Вы также можете использовать функцию sweep, которая похожа на apply и также очень хорошо работает с временными рядами

df <- ts(data = data.frame(A = c(3883, 3626, 4346, 3439), 
                        B = c(151831,154070, 163550, 155674)),
        frequency = 12)


sweep(df, MARGIN = 2, STATS = df[1,], FUN = "/") * 100


             A        B
Jan 1 100.00000 100.0000
Feb 1  93.38141 101.4747
Mar 1 111.92377 107.7185
Apr 1  88.56554 102.5311

В случае, если df не временной ряд, а данные.frame нужно поставить STATS = as.numeric(df[1,]), иначе он вернет ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...