Мой реальный набор данных - это 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
.
Любая помощь приветствуется!