ЕСЛИ условие основано на ROLLMEAN и ROLLAPPLY - PullRequest
0 голосов
/ 19 февраля 2019

Мой реальный набор данных - это 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)
}}}

То, что я делаю, - это удаление любых данных, которые превосходят среднее + 5х стандартное отклонение 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.

Любая помощь приветствуется!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...