ЕСЛИ условие основано на ROLLMEAN и 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)
}}}

То, что я делаю, - это удаление любых данных, которые превосходят среднее + 5x стандартное отклонение 20 смежных значений. Этот код выполняется, но он медленный и, скорее всего, не оптимизирован.
2 if должны избегать расчетаmeanа также sdс данными subscript out of bond,
Я хочу уменьшить код, используя rollmeanа также rollapply но я понятия не имею, как это сделать.

Пока это то, что я думаю, это должно выглядеть так:

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 ответов

Другие вопросы по тегам