Скользящая сумма по несбалансированному временному ряду - PullRequest
1 голос
/ 21 января 2012

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

Один из способов справиться с этим - добавить пустые строки для всех лет с нулевым числом инцидентов, а затем использовать rollapply() с четырехлетним окном, выровненным по левому краю, но это расширит мой набор данных больше, чем я хочу.Конечно, есть способ использовать ddply() и transform для этого?

Следующие две строки кода формируют фиктивный набор данных, а затем выполняют простую plyr сумму по категориям:

dat <- data.frame(
   category=c(rep('A',6), rep('B',6), rep('C',6)), 
   year=rep(c(2000,2001,2004,2005,2009, 2010),3), 
   incidents=rpois(18, 3)
   )

ddply(dat, .(category) , transform, i_per_c=sum(incidents) )

Это работает, но показывает только общее количество по категориям.

Я хочу, чтобы общее значение зависело от года.

Поэтому я пытаюсь расширить вызов ddply() с помощью синтаксиса function(), например, так:

ddply(dat, .(category) , transform, 
      function(x) i_per_c=sum(ifelse(x$year >= year - 4 & x$year < year,  x$incidents, 0) )
      )

Это просто возвращает исходный фрейм данных без изменений.

Должно быть, я что-то упускаю в синтаксисе plyr, но я не знаю, что это такое.

Спасибо, Мэтт

1 Ответ

3 голосов
/ 21 января 2012

Это довольно уродливо, но это работает. Вложенные вызовы:

ddply(dat, .(category), 
    function(datc) adply(datc, 1, 
         function(x) data.frame(run_incidents =
                                sum(subset(datc, year>(x$year-2) & year<=x$year)$incidents))))

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

...