基于ROLLMEAN和ROLLAPPLY的IF条件

时间:2019-02-19 11:00:29

标签: loops if-statement xts zoo rollapply

我的真实数据集是一个xts,具有4列x 110000行,具有信号输出值。我想做的是根据一些任意标准删除某些值。
sample_matrix中的xts数据集为例,我的代码如下:

require(xts)
require(zoo)
data("sample_matrix")
myxts <- as.xts(sample_matrix)

for (colonne in 1:ncol(myxts)) {

  for (i in 2:(nrow(myxts))) {

  if (i < 11) {
    j = i-1
    k = 10
  }else{
    if (i > nrow(myxts)-10){
      j = 10
      k = nrow(myxts)-i
    }else{
      j = 10
      k = 10
    }
  }
  if (myxts[i,colonne] > mean(myxts[i-j:i+k,colonne])+5*sd(myxts[i-j:i+k,colonne])) {
    myxts[i,colonne] <- NA
    myxts<- na.approx(myxts)
}}}

我正在做的是删除任何优于20个相邻值的平均值+ 5倍标准偏差的数据。该代码可以运行,但是速度很慢,很可能没有进行优化。 2 if是为了避免使用数据mean计算sdsubscript out of bond
我想使用rollmeanrollapply减少代码,但我不知道该怎么做。

到目前为止,我认为它应该是这样的:

for (i in 1:nrow(myxts)) {
if (myxts[i,] > rollmean(myxts[i,],k=20)+5*rollapply(myxts[i,],width = 20,FUN =sd)) {
  myxts[i,] <- NA
  myxts<- na.approx(myxts)
}}

但这会导致Error in rollapply.xts(x, k, FUN = (mean), fill = fill, align = align, : width <= nr is not TRUE
我不知道如何制作rollmean“跟随” i

欢迎任何帮助!

0 个答案:

没有答案