假设我在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)))
}
答案 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")