2015-10-22 3 views
-2

У меня есть следующие data.table:Как применять функцию квартальных данных

library(data.table) 
mydt <- data.table(DATE=c(201403,201406,201409,201412,201503,201506,201509), BALANCE = c(126,132,137,139,136,135,134), INCOME=c(288,298,303,303,299,297,292)) 

возвращение,

 DATE BALANCE INCOME 
1: 201403  126 288 
2: 201406  132 298 
3: 201409  137 303 
4: 201412  139 303 
5: 201503  136 299 
6: 201506  135 297 
7: 201509  134 292 

Я хотел бы вычислить, например, в 2015 Q3, значение будет (136-126)/(288 - 126) = 0,06. Завершенный результат будет следующим:

 DATE BALANCE INCOME CHANGE 
1: 201403  126 288  NA 
2: 201406  132 298  NA 
3: 201409  137 303  NA 
4: 201412  139 303  NA 
5: 201503  136 299 0.060 
6: 201506  135 297 0.017 
7: 201509  134 292 -0.016 

Не могли бы вы предложить?

+2

Все, что вы уже пробовали? Почему это не сработало? – Heroka

ответ

1

Одно из возможных решений для выполнения этих вычислений над подстрокой из DATE (а убедившись, что он заказан)

mydt[order(DATE), 
    CHANGE := c(NA, round(diff(BALANCE)/(INCOME[1L] - BALANCE[1L]), 3L)), 
    by = substr(DATE, 5L, 6L)] 
mydt 
#  DATE BALANCE INCOME CHANGE 
# 1: 201403  126 288  NA 
# 2: 201406  132 298  NA 
# 3: 201409  137 303  NA 
# 4: 201412  139 303  NA 
# 5: 201503  136 299 0.062 
# 6: 201506  135 297 0.018 
# 7: 201509  134 292 -0.018 

Ваших расчетов кажется немного прочь. Кроме того, это будет работать только на двухлетние данные, и вам нужно будет обобщить, что у вас много лет, и вам нужно скользящее сравнение, но это поможет вам начать.

+1

Я думаю, что для его обобщения достаточно нескольких 'shift':' mydt [, CHANGE: = (BALANCE-shift (BALANCE, type = "lag"))/shift (INCOME-BALANCE, type = "lag"), by =. (substr (DATE, 5,6))] 'Не уверен, что OP будет понимать это, не зная об этой функции. – Frank

+1

Ницца @Frank, смена, вероятно, будет работать в течение нескольких лет. –