2015-11-25 2 views
1

Я хочу применить вперед rollsum, то есть вместо того, чтобы давать мне сумму (или медиану) прошлых экземпляров, я хочу рассчитать сумму будущих экземпляров.Использование функции rollsum для будущих экземпляров (forward rollsum)

Я знаю функцию rollsumrollmedian, rollapply), но они просто работают для прошлых экземпляров. По крайней мере, я не смог найти информацию о том, как это сделать.

Пример:

price = c(c5,5,8,2,6,2,6,6,6,0,7,0,3,8,9,9)  
past = rollsum(price, 4, align='right',fill=NA)  
future = c(21,18,16,20,2018,19,13,10,18,20,29,rep(NA,4)) 
price past future 
    5 NA  21 
    5 NA  18 
    8 NA  16 
    2 20  20 
    6 21  20 
    2 18  18 
    6 16  19 
    6 20  13 
    6 20  10 
    0 18  18 
    7 19  20 
    0 13  29 
    3 10  NA 
    8 18  NA 
    9 20  NA 
    9 29  NA 
+0

Пожалуйста, покажите небольшой пример и ожидаемый результат. – akrun

+0

'rev'erse ваш вектор. – Roland

+0

Спасибо Roland. Кажется, я просто ответил на свой вопрос. Я думаю, что больше, чем реверсирование, мне нужно сдвинуть вектор на n мест, где n - это окно. Я имею в виду это для результата rollsum. – Andres

ответ

1

Мы могли бы также использовать roll_sum из library(RcppRoll)

library(RcppRoll) 
roll_sum(df1$price,4, align='left', fill=NA) 
2

Предполагая, что вы приказывая данные по дате, не могли вы что-то вроде:

df %>% 
    group_by(someFactorColumn) %>% # optional grouping variable 
    arrange(-dateItHappened) %>% 
    mutate(forwardsum = cumsum(valYouCareAbout) %>% 
    arrange(dateItHappened) 
4

The align управления аргументом этого. Так, например, путем указания align = "left" мы получаем следующее:

library(zoo) 

rollsum(1:6, 3, align = "left", fill = NA) 
## [1] 6 9 12 15 NA NA 

6-на выходе 1 + 2 + 3, 9 в выходе 2 + 3 + 4 и т.д. Последние два элемента являются Н.А. так нет трех будущих элементов.

Даже более гибкий доступ доступен, если вы используете rollapply. Например, это то же самое, что и выше:

rollapply(1:6, 3, sum, align = "left", fill = NA) 
## [1] 6 9 12 15 NA NA 

тогда следующие суммы в 3 компоненте ПОСЛЕ, но не включая текущий компонент (элементы списка являются смещение от текущего положения для использования, где 0 означает, что ток позиция, 1 - следующая позиция и т. д. - отрицательные числа могут использоваться для предыдущих позиций).

rollapply(1:6, list(1:3), sum, fill = NA) 
## [1] 9 12 15 NA NA NA 

Таким образом, 9 2 + 3 + 4, так как 2, 3, 4 являются 3 компонента, которые приходят после первого компонента, 1.

+0

Вы совершенно правы, и я прошу прощения за это. Я редактировал свой вопрос и добавил пример. Спасибо. – Andres

+0

И вы правы, выравнивание влево делает трюк. Не видел этого раньше. Еще раз спасибо. – Andres

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