2012-01-20 8 views
1

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

Один из способов управления этим состоит в том, чтобы добавить пустые строки за все годы с нулевыми инцидентами, а затем использовать 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, но я не знаю, что это такое.

Спасибо, Matt

ответ

3

Это Сорта некрасиво, но это работает. Вложенные вызовы:

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)))) 

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

+0

Harlan, спасибо. Похоже, что это может сработать, но где именно qq? –

+0

Ой, мой плохой. Имела временную переменную от тестирования. Исправлена. – Harlan

+0

Спасибо. Это остается лучшим решением, с которым я столкнулся. –

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

  • Нет связанных вопросов^_^