【发布时间】:2018-09-16 15:37:13
【问题描述】:
我想创建一个滑动窗口,其中窗口的开始被锚定,窗口的结束以一个单位的增量增长。因此,在窗口开始下方的数据框中,窗口开始处将保持在 0.10,而另一端将移动超过 0.08、0.15 等等,每次移动超过列 Speed 时都会执行一个函数。如果不满足函数的标准,则窗口的末端会继续移动。一旦满足条件,我希望第二列Out 中的一些输出与整个窗口中之前的所有元素一致。
一旦满足条件,窗口就会终止,然后再次锚定在最后一个窗口的末尾并重新开始,一次增长一个单位。
例如,对于这个数据框,标准可能是在重新开始之前窗口的平均值大于 0.1,所以:
mean(c(0.10, 0.08)) = 0.09 - criteria not met
mean(c(0.10, 0.08, 0.15)) = 0.11 - criteria met so all previous elements are labelled 'A'
下一步:
mean(c(0.13, 0.14)) = 0.14 - criteria met so all previous elements are labelled 'B'
下一步:
mean(c(0.08, 0.10)) = 0.09 - criteria not met
mean(c(0.08, 0.10, 0.07)) = 0.08 - criteria not met
mean(c(0.08, 0.10, 0.07, 0.15)) = 0.1 - criteria met so all previous elements are labelled 'C'
Speed Out
0.10 A
0.08 A
0.15 A
0.13 B
0.14 B
0.08 C
0.10 C
0.07 C
0.15 C
我已经尝试修改THIS Cross Validated 帖子中的解决方案(@mbq 和@r_evolutionist 的回答,但运气不佳。此外,我在包zoo 中使用rollapply 并列,但我觉得这需要自制功能。
【问题讨论】:
-
我不清楚你在问什么。您能否提供示例所需的输出?
-
谢谢。我已经编辑了这篇文章,希望现在更清楚了。
-
cumsum,其他一些累积函数在base,dplyr有cummean(或it's quite easy to implement if you don't want the dependency)。您可以执行完整的 cummean,然后反复查找窗口中断。我认为您无法为查找窗口中断做一个完全矢量化的解决方案,因此如果您需要效率,您可以在 Rcpp 中编写您自己的版本(我的链接中 cummean 的 Rcpp 实现应该可以帮助您入门)。 -
谢谢格雷戈尔。我实际上想对窗口实现不同的功能而不是平均值,但我认为这可能是一个更容易演示的示例。一个 for 循环可以做到这一点吗?
标签: r sliding-window