我正在尝试在一个窗口上使用 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
如果由于某种原因你必须只保留width
3 并且不能改变它,那么我们可以做
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] 删除。
我来说两句