Как агрегировать данные во временной последовательности?

#r #aggregate #time-series

#r #агрегировать #временные ряды

Вопрос:

У меня проблема, и мне действительно нужна ваша помощь? Мои данные (назовем их «дата») выглядят так:

 location       date  value
       1 2010-01-01    6.4
       1 2010-01-02    5.7
       .
       .  
       2 2010-01-01    0.8
       2 2010-01-02    2.5
       2 2010-01-03    5.5
 

Я хотел бы агрегировать данные (значение) по местоположению и по 3-недельному периоду? Я уже пытался использовать временные ряды пакетов, но это не работает?

 by1 <- timeSequence(from = "2009-12-30", to = "2010-12-29", by= "4 week")
by1
aggregate(date, by=list(by1, date$location), sum)
 

Комментарии:

1. Привет, MtS. Если ответ Андри решил вашу проблему, вы можете / должны «принять» его, щелкнув галочку рядом с ним. Спасибо.

Ответ №1:

Вот подход, используемый seq.Date для создания точек останова cut , объединения ваших данных и ddply суммирования:

 # Create sample data
set.seed(1)
dat <- data.frame(
  location = rep(1:3, each=30),
  date = rep(seq(as.Date("2010-01-01"), by="3 day", length.out=30), 3),
  value=rnorm(90)
)

# Create a sequence of dates in period of 3 weeks ot serve as cut points
dateCuts <- seq(from=min(dat$date), to=max(dat$date) 31, by="3 week")

# Use cut to separate dates into periods
dat$period <- cut(dat$date, breaks=dateCuts)

# Summarise data
library(plyr)
ddply(dat, .(location, period), summarize, value=mean(value))
 

Результаты:

    location     period       value
1         1 2010-01-01  0.04475859
2         1 2010-01-22  0.01062880
3         1 2010-02-12  0.62024902
4         1 2010-03-05 -0.31364304
5         1 2010-03-26 -0.03010425
6         2 2010-01-01 -0.08522653
7         2 2010-01-22  0.37708986
8         2 2010-02-12  0.12910449
9         2 2010-03-05  0.08597110
10        2 2010-03-26  0.21733251
11        3 2010-01-01  0.10295425
12        3 2010-01-22  0.46194453
13        3 2010-02-12 -0.35546029
14        3 2010-03-05  0.17216486
15        3 2010-03-26  0.31855880
 

Ответ №2:

Используя lubridate , вы можете записать это с помощью однострочника.

 ddply(dat, .(location, ceiling(week(date)/3)), summarize, value = mean(value))
 

Комментарии:

1. Очень аккуратное использование ceiling и week , но вы уверены, что это делает то же самое? week кажется, возвращает неделю в месяце — она не разбивается на периоды по n недель. Возможно, это то, чего хотел OP (т. Е. Сравнить неделю 1 января с неделей 1 февраля), но я прочитал сравнение недель 1-3 с неделями 4-6 с неделями 7-9 и т. Д.

2. @Andrie вы правы. ваше решение заботится о биннинге без этого ограничения.