R中的滑动窗口
Posted
技术标签:
【中文标题】R中的滑动窗口【英文标题】:Sliding window in R 【发布时间】:2013-04-03 07:58:11 【问题描述】:我有一个数据框 DF,两列 A 和 B 如下所示:
A B
1 0
3 0
4 0
2 1
6 0
4 1
7 1
8 1
1 0
如下所示执行滑动窗口方法。使用:rollapply(DF$B, width=3,by=1) 计算大小为 3 的滑动窗口中 B 列的平均值滑动 1。每个窗口的平均值显示在左侧。
A: 1 3 4 2 6 4 7 8 1
B: 0 0 0 1 0 1 1 1 0
[0 0 0] 0
[0 0 1] 0.33
[0 1 0] 0.33
[1 0 1] 0.66
[0 1 1] 0.66
[1 1 1] 1
[1 1 0] 0.66
output: 0 0.33 0.33 0.66 0.66 1 1 1 0.66
现在,对于 A 列中的每一行/坐标,包含该坐标的所有窗口都被考虑并应保留给出结果的最高平均值,如“输出”列所示。
我需要得到如上所示的输出。输出应该是:
A B Output
1 0 0
3 0 0.33
4 0 0.33
2 1 0.66
6 0 0.66
4 1 1
7 1 1
8 1 1
1 0 0.66
对 R 有帮助吗?
【问题讨论】:
(+1) 现在我明白了这个问题。让我试着看看我能不能弄清楚一些事情。还有一件事。我认为您在此编辑中丢失了最终输出“mean_A”。你也可以添加它吗?谢谢。 @Arun 现在我添加了 Mean_A。A
总是一个序列 1:N?我看不出A
中的值对您的计算有何影响。据我了解,这几乎是rollmax(rollmean(B,3),3)
。
@CarlWitthoft,不完全是。 user1779730,检查我的答案。
@CarlWitthoft,希望重新构建的问题有助于理解问题
【参考方案1】:
试试这个:
# form input data
library(zoo)
B <- c(0, 0, 0, 1, 0, 1, 1, 1, 0)
# calculate
k <- 3
rollapply(B, 2*k-1, function(x) max(rollmean(x, k)), partial = TRUE)
最后一行返回:
[1] 0.0000000 0.3333333 0.3333333 0.6666667 0.6666667 1.0000000 1.0000000
[8] 1.0000000 0.6666667
如果有 NA
值,您可能想试试这个:
k <- 3
B <- c(1, 0, 1, 0, NA, 1)
rollapply(B, 2*k-1, function(x) max(rollapply(x, k, mean, na.rm = TRUE)), partial = TRUE)
最后一行给出了这个:
[1] 0.6666667 0.6666667 0.6666667 0.5000000 0.5000000 0.5000000
将其扩展为:
c(mean(B[1:3], na.rm = TRUE), ##
max(mean(B[1:3], na.rm = TRUE), mean(B[2:4], na.rm = TRUE)), ##
max(mean(B[1:3], na.rm = TRUE), mean(B[2:4], na.rm = TRUE), mean(B[3:5], na.rm = TRUE)),
max(mean(B[2:4], na.rm = TRUE), mean(B[3:5], na.rm = TRUE), mean(B[4:6], na.rm = TRUE)),
max(mean(B[3:5], na.rm = TRUE), mean(B[4:6], na.rm = TRUE)), ##
mean(B[4:6], na.rm = TRUE)) ##
如果您不想在每一端都有k-1
组件(上面标有##
),请删除partial = TRUE
。
【讨论】:
那里——我知道有人会正确地表达我上面的评论:-) @G.Grothendieck 谢谢。 rollapply 函数中的 5 是什么? @G.Grothendieck 根据什么近似值将宽度设置为 5?这只是一个示例数据。真实数据的窗口大小为 5000,滑动 1。在这种情况下,我们如何确定窗口的宽度? @G.Grothendieck 非常感谢非常简单有效的解决方案。现在看来我们可以模拟任何宽度。还有一个查询,我最初使用 rollapply(DF$B, width=3,by=1) 来计算窗口大小 3 滑动=1 位置的平均值。但是在您的解决方案中,滑动 by='' 参数没有任何意义。我可以假设它以相同的方式滑动 1 个位置来计算平均值吗? 有两个长度为 5 的窗口。由于数量太多,我已经删除了我的 cmets,并在答案末尾添加了一些其他信息。【参考方案2】:R 库 TTR 有许多用于计算滑动窗口平均值的函数
SMA = 简单移动平均线
data$sma <- SMA(data$B, 3)
更多文档在这里http://cran.r-project.org/web/packages/TTR/TTR.pdf
【讨论】:
以上是关于R中的滑动窗口的主要内容,如果未能解决你的问题,请参考以下文章