#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 вы правы. ваше решение заботится о биннинге без этого ограничения.