我正在尝试移动平均线(类似于RcppRoll
中的roll_mean),除了在每个窗口,我想修剪异常值(例如,第5至第95百分位数值。)
举个例子,给出一个滚动窗口
v <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
考虑到我想要10到90%的数值,我应该得到5.5
的答案(1和10将被排除在外,并且对其余的值采取均值(2)到9)。
遗憾的是,我无法使用像RcppRoll::roll_mean
这样的函数,因为修剪需要在每个滚动窗口完成。
我能够通过向zoo::rollapply
提供自定义均值函数来实现这一点 - 但对于我的用例(&gt; 1e6行)来说,它的工作速度太慢了。
我查看了支持滚动功能的各种软件包(例如RcppRoll
,zoo
,TTR
,caTools
,roll
等。它们似乎支持这种修剪功能。
我正在考虑使用Rcpp来构建自定义的快速滚动功能,但我对这个框架相对不熟悉。不确定是否有更好的解决方案。
这里将不胜感激。
答案 0 :(得分:-1)
我想你可以做点像
rollapply(data, 10, function(x) mean(x[x>=quantile(x,0.1) & x<=quantile(x,0.9)]))
答案 1 :(得分:-1)
这是base-R中的一个函数,它比pymongo.errors.OperationFailure: 'pipeline' option must be specified as an array
快得多。它可能会进一步简化它,但原则似乎有效。它通过使用“滚动”来避免每个窗口的排序。排序的矢量zoo::rollapply
,只需在窗口滚动时为旧元素和新元素更新它。
vec