Скользящая сумма с динамическим размером окна c и пропуском первых нескольких строк - PullRequest
2 голосов
/ 16 января 2020

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

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

Приведенный ниже код помогает привести пример моих потребностей.

set.seed(122)
df <- data.frame(rain = rep(5,10),temp=1:10, skip = sample(0:2,10,T),
                 windw_sz = sample(1:2,10,T),city =c(rep("a",5),rep("b",5)),ord=rep(c(1:5),2)) 
df
   rain temp skip windw_sz city ord
1     5    1    0        2    a   1
2     5    2    1        1    a   2
3     5    3    2        2    a   3
4     5    4    2        1    a   4
5     5    5    2        2    a   5
6     5    6    0        1    b   1
7     5    7    2        2    b   2
8     5    8    1        2    b   3
9     5    9    2        1    b   4
10    5   10    2        2    b   5

В первой строке пропустите == 0 и window_size == 2, поэтому я должен рассмотреть переменные за сегодня и вчера. Во второй строке пропустите == 1 и размер окна == 1, поэтому мне нужно учитывать переменные только со вчерашнего дня. В третьей строке пропустите == 2 и размер окна == 2, поэтому я должен пропустить переменную с сегодняшнего дня и вчера и рассмотреть только два дня до вчерашнего дня.

Любое решение приветствуется, но мне бы особенно понравилось что-то с data.table.

Большое спасибо за любые предложения

1 Ответ

4 голосов
/ 16 января 2020

Я думаю, что data.tables frollsum () должна работать здесь:

dd <- data.table(value = 1:10,
                 offset = c(0, 1, 0, 0, 2, 0, 0, 0, 0, 1),
                 windowsize = c(1, 1, 1, 3, 3, 2, 0, 1, 0, 2))

dd[, frollsum(value, windowsize + offset, adaptive=TRUE) - frollsum(value, offset, adaptive=TRUE)]

Я не мог понять, как сделать так, чтобы скользящая сумма «дополнялась» 0, если размер окна расширяет значения ... установка 'na.rm = TRUE' тоже не помогла.

...