在将来的实例中使用rollum函数(向前卷)

时间:2015-11-25 17:28:59

标签: r dplyr zoo

我想应用转发rollsum,即不是给我过去实例的总和(或中位数),而是想计算未来实例的总和。

我知道函数rollsum(以及rollmedianrollapply),但它们只适用于过去的实例。至少,我还没有找到有关如何做的信息。

示例:

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

3 个答案:

答案 0 :(得分:4)

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等。最后两个元素是NA,因为没有3个未来元素。

如果您使用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。

答案 1 :(得分:2)

假设您按日期订购数据,则无法执行以下操作:

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

答案 2 :(得分:1)

我们也可以使用roll_sum

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