2016-10-31 9 views
1

Это данные кадрУсловная сумма качению

Date  ID cost Value 
15/12/2016 1 yes 200 
15/10/2016 1 yes 100 
15/9/2016 1 yes 55 
15/04/2016 1 yes 1000 
15/12/2016 2 yes 300 
15/10/2016 2 yes 200 
15/9/2016 2 yes 100 
15/04/2016 2 yes 1000 
15/12/2016 3 no  300 
15/10/2016 3 no  200 
15/9/2016 3 no  100 
15/04/2016 3 no  1000 

Я хотел бы повторить качение суммы на 3 месяца для каждого ID, которые имеют стоимость = «да». Обратите внимание, что в примере идентификаторы всего 3, но в моей БД - n.

Выход должен быть

Date  ID Value Rolling_Sum 
15/12/2016 1 200 355 
15/10/2016 1 100 155 
15/9/2016 1 55 55 
15/04/2016 1 1000 1000 
15/12/2016 2 300 600 
15/10/2016 2 200 300 
15/9/2016 2 100 100 
15/04/2016 2 1000 1000 

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

Благодаря

+0

теперь я пытаюсь rollapply, но я не знаю, если это так – Tyu1990

+0

кажется, но этот вопрос немного отличается и усложняет .. это нормально? – Tyu1990

ответ

2

Вы можете использовать функцию foverlaps из data.table -package для этого:

library(data.table) 
library(lubridate) 

# convert the data to a 'data.table' 
setDT(dt) 
# convert the Date column to date-class 
dt[, Date := as.Date(Date, '%d/%m/%Y')] 
# create an exact same column to be used by the 'foverlaps' function 
dt[, bdate := Date] 
# create a reference 'data.table' with the 3 month intervals 
dtc <- copy(dt)[, bdate := Date %m-% months(3)] 
# set the keys for the reference data.table (needed for the 'foverlaps' function) 
setkey(dtc, ID, bdate, Date) 
# create the overlaps and summarise 
foverlaps(dt[cost=='yes'], dtc, type = 'within')[, .(val = sum(i.Value)), by = .(ID, Date)] 

, который дает:

ID  Date val 
1: 1 2016-12-15 355 
2: 1 2016-10-15 155 
3: 1 2016-09-15 55 
4: 1 2016-04-15 1000 
5: 2 2016-12-15 600 
6: 2 2016-10-15 300 
7: 2 2016-09-15 100 
8: 2 2016-04-15 1000 
+0

COOL это работает, спасибо .. но я не понимаю bdate: = Дата% m-% месяцев (3). Как это работает? – Tyu1990

+0

@ Tyu1990 'bdate: = Дата% m-% месяцев (3)' вычитает 3 месяца с каждой даты, см. '? '% M +%'' (при загрузке пакета lubridate). Для объяснения ': =' см. [Page on reference sematics] (https://rawgit.com/wiki/Rdatatable/data.table/vignettes/datatable-reference-semantics.html) 'data.table' [Начало работы] (https://github.com/Rdatatable/data.table/wiki/Getting-started) wiki. – Jaap

+0

, если я добавлю условие в критерии столбца, оно дает мне это предупреждение: Предупреждающие сообщения: 1: В difftime (e1, e2, units = "days"): Достигнуто общее распределение 7856Mb: см. Справку (memory.size) 2: В difftime (e1, e2, units = "days"): Достигнуто общего распределения 7856Mb: см. Справку (memory.size) – Tyu1990