将 rollapply 与 xts 对象和匿名定义函数一起使用

厄尼

我正在尝试在一个窗口上使用 rollapply 创建滚动计算,该窗口向下滑动 xts 数据框的列。例如,假设我定义了一个 xts 对象:

df1 <- data.frame(A = c(1,2,3,4,5,6,7,8,9),
              B = c(3,4,5,6,7,8,9,10,11))
dfxts <- xts(df1, order.by = as.Date(c(30,31,32,33,34,35,36,37,38)))

这给出了 xts 函数:

           A  B
1970-01-31 1  3
1970-02-01 2  4
1970-02-02 3  5
1970-02-03 4  6
1970-02-04 5  7
1970-02-05 6  8
1970-02-06 7  9
1970-02-07 8 10
1970-02-08 9 11

据我了解宽度参数,它定义了发生某些操作的滑动窗口的长度,例如平均操作(尽管我不清楚“宽度”)。

假设我想在宽度为 3 的窗口上创建一个滚动操作,我在每个位置添加窗口的第二个和第三个元素。在窗口的每个位置我想添加 x(2) + x(3)。我会得到:

           A  B
1970-01-31 NA NA
1970-02-01 NA NA
1970-02-02 5  9
1970-02-03 7  11
1970-02-04 9  13
1970-02-05 11 15
1970-02-06 13 17
1970-02-07 15 19
1970-02-08 17 21

我尝试通过以下方式实现:

 rollapply(dfxts, width = 3, FUN=function(x) x(2)+x(3), align = "right")

我得到错误:

“结束时出错:找不到函数“x”

我想我误解了如何使用 rollapply,如何实现匿名函数,或两者兼而有之。

罗纳克·沙阿

我不确定您是否可以将 应用于rollapply整个数据帧。您可以将其分别应用于每一列,lapply并且由于您想要sum第二个和第三个元素,因此可以将其减少width为 2

library(zoo)
lapply(dfxts, function(x) rollapply(x, width = 2, FUN=sum))


#$A
#            A
#1970-01-31 NA
#1970-02-01  3
#1970-02-02  5
#1970-02-03  7
#1970-02-04  9
#1970-02-05 11
#1970-02-06 13
#1970-02-07 15
#1970-02-08 17

#$B
#            B
#1970-01-31 NA
#1970-02-01  7
#1970-02-02  9
#1970-02-03 11
#1970-02-04 13
#1970-02-05 15
#1970-02-06 17
#1970-02-07 19
#1970-02-08 21

如果由于某种原因你必须只保留width3 并且不能改变它,那么我们可以做

lapply(dfxts, function(x) rollapply(x, width = 3, FUN=function(y) sum(y[2],y[3])))

这将给出相同的输出,除了前两个值将是NA而不是一个。


编辑

正如评论中提到的,要应用的实际函数比呈现的函数更复杂,它需要使用自定义函数而不是我们可以coredata用来获取实际数据的内置函数,然后相应地应用我们的函数。

所以在给定的例子中,我们可以做

rollapply(dfxts, width = 3, FUN=function(x) coredata(x[2]) +  coredata(x[3]))

然而,对于更通用的方法,我们只能调用coredata一次,然后按照我们想要的方式使用它们。所以如果我们想应用操作5*x(5) - 8*x(7) + x(15),我们可以做

rollapply(dfxts, width = 15, FUN=function(x) {
          vals <- coredata(x)
          5*vals[5] - 8*vals[7] + vals[15]
})

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章