ЕСЛИ условие основано на 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
,
Любая помощь приветствуется!