Я использую R. Я знаю, что вычисление скользящего среднего - это тема с несколькими ответами на этом сайте, но у меня есть некоторые проблемы, которые делают мой вопрос уникальным.
У меня есть фрейм данных, включающий 8784 почасовых концентрации (366 дней * 24 часа) загрязнителя воздуха (Озон).Этот фрейм данных содержит некоторые значения NaN (пропущенные значения).Процедура содержит следующие этапы:
1 - расчет скользящих (скользящих) средних значений за 8 часов для часовых концентраций: т.е. каждые 8 концентраций должны быть усреднены таким образом: среднее значение от 1 до 8, среднее значение от 2 до 9,среднее значение от 3 до 10 и т. д. Это приводит к получению 24 скользящих средних за каждый день (каждые 24 часа).
2- за каждый день, я хочу максимум 8-часовых скользящих средних: т.е.24 скользящих средних, наибольшее число должно быть выбрано.Наконец, будет выбрано 366 скользящих средних (366 дней).
3- Необходимо создать новый фрейм данных, содержащий 366 скользящих средних.
Я знаю, что есть несколько пакетов (openair, zoo,TTR), которые делают что-то вроде этого, но есть ли способы написать коды без каких-либо пакетов?
An Exmaple of my data
ColName
1 18.76
2 12.92
3 8.12
4 NaN
5 12.92
6 3.77
7 18.76
8 9.52
9 94.09
10 18.76
11 14.13
12 8.12
13 2.04
14 12.92
15 9.17
.
.
.
8783 34.58
8784 64.23
Имя основного фрейма данных - «Почасово».Я пробовал эти коды:
Hourly1 <- c(0, cumsum(ifelse(is.nan(Hourly), 0, Hourly)))
rsum <- (Hourly1[(Hourly1+1):length(Hourly1)] - Hourly1[1:(length(Hourly1) - 8)]) / 8
Но когда я пробую первую строку, возникает следующая ошибка:
Error in is.nan(Hourly) : default method not implemented for type 'list'
ОБНОВЛЕНИЕ: я использовал следующие коды, но максимум 8-средние значения по часам не рассчитаны правильно:
Hourly2<-as.numeric(Hourly$Average)
names(Hourly2) <- rep(seq.Date(as.Date("2017-01-01"), by=1, length.out=366), each=24)
x<-Hourly2
#use cumsum to get the moving average, keep NaNs
cx <- c(0, cumsum(ifelse(is.nan(x), 0, x))) + c(0,x)*0
n <- 8
rsum <- (cx[(n+1):length(cx)] - cx[1:(length(cx) - n)]) / n
res <- data.frame(mov_avg=rsum, days=names(rsum))
#select max from each day, ignoring NaN's
mx <- aggregate(mov_avg~days, data=res, max)
Я сравнил окончательные результаты (максимум 366 из 8-часовых средних, каждый за 1 день года) со стандартным предварительно утвержденным набором данных.В некоторые дни коды рассчитывают средние значения правильно, а в другие дни нет!Я не понял его логику.
Вы можете найти мой необработанный набор данных здесь!
ОБНОВЛЕНИЕ 2:
Вот ссылка наскачать окончательные результаты, полученные разными методами!
ОБНОВЛЕНИЕ3:
Разница между результатами была связана с различными методами расчета скользящих средних.Существует три метода расчета скользящих средних: слева, справа и по центру.Коды, предложенные здесь ребятами, следуют «правильному» методу.