Роллинг Сум Дплыр - PullRequest
       16

Роллинг Сум Дплыр

0 голосов
/ 25 января 2019

Если у меня есть фрейм данных, и я хочу использовать скользящую сумму для суммирования предыдущих n строк и следующих n строк, каков наилучший способ сделать это?Мне известно о roll_sum, но я не могу найти способ использовать его для своего случая использования.Например, допустим, у меня есть вектор n.И я указываю, что хочу, чтобы мое окно было равно 1, что означает для каждой записи, которую я хочу суммировать, и для двух смежных записей.

n   window1
1   NA
3   8
4   12
5   15
6   18
7   22
9   17
1   15
5   6

Если бы я указал 2 в качестве размера окна, то это было бырезультат:

n   window1 window2
1   NA  NA
3   8   NA
4   12  19
5   15  25
6   18  31
7   22  28
9   17  28
1   15  22
5   6   15

Есть ли простой способ сделать это?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Я думаю, что rollapplyr из пакета зоопарка - твой друг.С align = 'center' вы можете суммировать предыдущие n строк и следующие n строк.

0 голосов
/ 25 января 2019

Вероятно, есть специальные функции, но, похоже, это работает.Это дает вам некоторый контроль над тем, как вы хотите, чтобы он вел себя.Например, функция default = 0 в опережении позволяет перейти к последней записи, даже если нет опережающих значений.Держу пари, что это относительно медленно и неэффективно.

library(dplyr)
library(purrr)

rolling_sum <- function(v, window = 1) {

  k <- 1:window

  vLag <- k %>%
    map_dfc(~lag(v, .))

  vLead <- k %>%
    map_dfc(~lead(v, ., default = 0))

  rowSums(bind_cols(vLag, V = v, vLead))

}

df <- data.frame(n = c(1,3,4,5,6,7,9,1,5))

df %>%
  mutate(window1 = rolling_sum(n, 1),
         window2 = rolling_sum(n, 2))
...