2015-12-14 5 views
1

У меня есть набор данных с датами, происходящими случайным образом. Например:Скользящий средний по времени, а не наблюдению в R

10/21/15, 11/21/15, 11/22/15, 11/28/15,11/30/15, 12/12/15 ... и т.д.

Я хочу создать скользящее среднее по периоду времени НЕ на уровне наблюдения. Например, если бы я хотел сделать скользящее среднее за последние 7 дней. Я бы не хотел, чтобы посмотреть на последние 7 рядов, а последние 7 дней

Для крошечного примера:

dates = c('2015-08-07', '2015-08-08','2015-08-09','2015-09-09','2015-10-10') 
value = c(5,10,5,3,2) 
df=data.frame(dates, value) 
df$desired = c(NA,5,7.5, NA,NA) 

Я, очевидно, хочу сделать это для гораздо большего набора данных, но Надеюсь, вы поняли эту идею. Если бы я использовал 7 дней, например, это результат, которого я ожидал бы.

Обратите внимание, что я не включаю текущее значение наблюдений в скользящее среднее значение, только предыдущее. Я хочу скользящее среднее по периоду времени, а не номер строки наблюдения.

Я пробовал смотреть на рулетку и dplyr, но я не мог понять это. Мне все равно, как это происходит.

Спасибо!

+1

разделить процесс на несколько частей: 1. агрегате в периоды, 2. присоединиться к рядам всех периодов, чтобы заполнить возможные пробелы в данных с НС, 3. применять rollmean – jangorecki

ответ

0

попробовать это:

rollavgbyperiod <- function(i,window){ 
    startdate <- dates[i]-window 
    enddate <- dates[i]-1 
    interval <- seq(startdate,enddate,1) 

    tmp <- value[dates %in% interval] 
    return(mean(tmp)) 
} 

dates <- as.Date(dates) 
window <- 7 
res <- sapply(1:length(dates),function(m) rollavgbyperiod(m,window)) 
res[is.nan(res)] <- NA 

> data.frame(dates,value,res) 
     dates value res 
1 2015-08-07  5 NA 
2 2015-08-08 10 5.0 
3 2015-08-09  5 7.5 
4 2015-09-09  3 NA 
5 2015-10-10  2 NA 
+0

I имеют ту же потребность/проблему, но хотели бы использовать ряд дат и значений зоопарка. Есть ли простой способ использовать скользящий средний по календарной дате с объектом зоопарка? Единственный способ, который я нашел, - использовать функцию окна для захвата подмножества серии, но я продолжаю думать, что может быть лучший способ. – Ernie

+0

@ Ernie Почему это решение не работает? –

+0

Да, я думаю, вы правы. Это будет работать, но вам, очевидно, придется обращаться к индексу даты объекта зоопарка, а не иметь отдельный вектор даты. Но я еще не пробовал. – Ernie