Я хочу вычислить сумму по скользящему окну для сгруппированных данных.
Поскольку я хотел бы придерживаться официальных функций, если это возможно, я начал с rollapplyr, как это:
library(tidyverse)
library(reshape2)
library(zoo)
data = data.frame(Count=seq(1,10,1),
group=c("A","B","A","A","B","B","B","B","A","A"))
window_size <- 3
data_rolling <- data %>%
arrange(group) %>%
group_by(group) %>%
mutate(Rolling_Count = rollapplyr(Count, width=window_size, FUN=sum, fill = NA)) %>%
ungroup()
для первых записей, которые меньше ширины (в данном случае 3), она заполняется NA, как определено, но на самом деле я хотел бы иметь сумму возможных данных там, как это:
Count group Rolling_Count expected_Result
1 A NA 1
3 A NA 4
4 A 8 8
9 A 16 16
10 A 23 23
2 B NA 2
5 B NA 7
6 B 13 13
7 B 18 18
8 B 21 21
Iзнаю, что я могу заменить width=window_size
на что-то вроде этого:
c(rep(1:window_size,1),rep(window_size:window_size,(n()-window_size)))
, чтобы получить то, что я хочу, но это действительно медленно.Кроме того, этот подход предполагает, что n () больше, чем window_size.
Итак: Существует ли уже функция R / zoo, которая может обрабатывать сгруппированные данные, как указано выше, и, кроме того, данные с меньшим количеством записей window_size и быстрее по сравнению с вышеупомянутым подходом?
Спасибо за любые подсказки!