计算加权滚动平均值R.

时间:2014-07-09 06:51:40

标签: r

假设我在dataframe / data.table中有两列,一个是级别,另一个是卷。我想计算水平的滚动平均值,按体积加权,因此对于某些滚动窗口,音量作为权重(标准化为1)。

Base R有一个weighted.mean()函数,它对两个静态向量进行类似的计算。我尝试使用sapply将list / vector fo参数传递给它并创建一个rollign系列,但无济于事。

其中"适用"机制我应该使用weighted.mean()来获得所需的结果,或者我必须循环/编写我自己的函数?

/////////////////////////////////////////////// /////////////////////////////////////////

P.S。最后我决定编写简单的自定义函数,它使用了很棒的RccpRoll包。我发现RccpRoll比其他滚动方法更快,更快,这对我很重要,因为我的数据是几百万行。

该函数的代码如下所示(由于RccpRoll在没有NAs的情况下返回数据,我在开始时添加了一些NAs):

require(RcppRoll)
my.rollmean.weighted <- function(vec1,vec2,width){
   return(c(rep(NA,width-1),roll_sum(vec1*vec2,width)/roll_sum(vec2,width)))
}

2 个答案:

答案 0 :(得分:3)

我认为这可能有效。它采用rollapply文档中演示的滚动回归技术。关键是by.column=FALSE。这将滚动显示所有列的矩阵。

  require(zoo)

  df <- data.frame(
    price = cumprod(1 + runif(1000,-0.03,0.03)) * 25,
    volume = runif(1000,1e6,2e6)
  )

  rollapply(
    df,
    width = 50,
    function(z){
      #uncomment if you want to see the structure
      #print(head(z,3))
      return(
        weighted_mean = weighted.mean(z[,"price"],z[,"volume"])
      )
    },
    by.column = FALSE,
    align = "right"
  )

如果它不起作用或不清楚,请告诉我。

答案 1 :(得分:0)

以下是可能有用的代码段。它使用zoo包中的rollmean函数,以及两个间隔(您选择间隔)。你将使用weighted.mean函数计算的变量,我假设:

library(zoo) # for the rollmean() function

movavg <- rollmean(df$weightedVariable, k = 2, align = "right")