2015-07-14 6 views
4

У меня есть данные о прогнозе погоды, в которых записывается прогноз количества осадков за каждый час. Я хотел бы сравнить это с данными наблюдений, в которых наблюдалось количество осадков на каждые 6 часов. Таким образом, мне нужно объединить данные прогноза с 6-часовыми данными.Сплит-агрегирование данных временных рядов в R

Вот краткий обзор моих данных:

     DateUtc StationID FcstDay PrecipQuantity_hSum 
1  2014-01-01 12:00:00  54745  0     0 
2  2014-01-01 13:00:00  54745  0     0 
3  2014-01-01 14:00:00  54745  0     0 
4  2014-01-01 15:00:00  54745  0     0 
5  2014-01-01 16:00:00  54745  0     0 
6  2014-01-01 17:00:00  54745  0     0 
7  2014-01-01 18:00:00  54745  0     0 
8  2014-01-01 19:00:00  54745  0     0 
9  2014-01-01 20:00:00  54745  0     0 
10  2014-01-01 21:00:00  54745  0     0 
11  2014-01-01 22:00:00  54745  0     0 
12  2014-01-01 23:00:00  54745  0     0 
13  2014-01-02 00:00:00  54745  1     0 
14  2014-01-02 01:00:00  54745  1     0 
15  2014-01-02 02:00:00  54745  1     0 
16  2014-01-02 03:00:00  54745  1     0 
17  2014-01-02 04:00:00  54745  1     0 
18  2014-01-02 05:00:00  54745  1     0 
19  2014-01-02 06:00:00  54745  1     0 
20  2014-01-02 07:00:00  54745  1     0 
...      <NA>  <NA>  ...     ... 
13802582 2014-11-20 08:00:00  55005  7     0 
13802583 2014-11-20 09:00:00  55005  7     0 
13802584 2014-11-20 10:00:00  55005  7     0 
13802585 2014-11-20 11:00:00  55005  7     0 
13802586 2014-11-20 12:00:00  55005  7     0 

Чтобы правильно агрегировать, важно разделить на StationID (метеостанция) и FcstDay (количество дней между датой расчета прогноза и датами существами прогноз) до агрегации.

Я использовал пакет xts, чтобы выполнить агрегацию, и он работает как ожидалось, если я вручную подмножу данные сначала, например.

z <- fcst[which(fcst$StationID=="54745" & fcst$FcstDay==1),] 
z.xts <- xts(z$PrecipQuantity_hSum, z$DateUtc) 
ends <- endpoints(z.xts, "hours", 6) 
precip6 <- as.data.frame(period.appl(z.xts, ends, sum)) 

мне нужно автоматизировать Подменю, но я попытался обернуть xts функции в различных разделенным применять функции и всегда получаю ту же ошибку:

Error in xts(z$PrecipQuantity_hSum, z$DateUtc) : 
    NROW(x) must match length(order.by) 

Это моя последняя версия моего код:

df <- data.frame() 

    d_ply(
    .data = fcst, 
    .variables = c("FcstDay", "StationID"), 
    .fun = function(z){ 
     z.xts <- xts(z$PrecipQuantity_hSum, z$DateUtc) 
     ends <- endpoints(z.xts, "hours", 6) 
     precip6 <- as.data.frame(period.apply(z.xts, ends, sum)) 
     precip6$DateUtc <- rownames(precip6) 
     rownames(precip6) <- NULL 
     df <- rbind.fill(df, precip6) 
    }) 

Я также попытался вложенными for петли. Может ли кто-нибудь дать какие-либо указания о том, что не так? Я включил код для воспроизводимого примера, приведенного ниже. Заранее спасибо.

DateUtc <- rep(seq(from=ISOdatetime(2014,1,1,0,0,0), to=ISOdatetime(2014,12,30,0,0,0), by=(60*60)), times=9) 
StationID <- rep(c("50060","50061","50062"), each=3*8713) 
FcstDay <- rep(c(1,2,3), each=8713, times=3) 
PrecipQuantity_hSum <- rgamma(78417, shape=1, rate=20) 
fcst <- data.frame(DateUtc, StationID, FcstDay, PrecipQuantity_hSum) 
+0

Не должен ли ваш воспроизводимый пример быть 'data.frame', а не' cbind'? Так как он создает матрицу символов –

+0

Да, вы правы, спасибо! Ред. – hanwick1

+0

Я также не могу воспроизвести вашу ошибку; когда я запускаю один и тот же воспроизводимый код, я получаю кадр данных с столбцом V1, который является «NA». Это похоже на проблему, но я также получаю NA, когда подмножество для одной станции перед использованием 'period.apply'. Попробуйте запустить воспроизводимый пример и убедитесь, что он дает вам такую ​​же ошибку. (Я подозреваю, что с помощью cbind вы не пробовали только один воспроизводимый пример :) –

ответ

0

Я думаю, что ошибка Дэвид Робинсон становится потому, что ваш пример кода использует PrecipQuantity_6hSum и не PrecipQuantity_hSum. После этого ваш код ddply работает для меня.

Это работает для вас?

df<-ddply(
    .data = fcst, 
    .variables = c("FcstDay", "StationID"), 
    .fun = function(z){ 
     z.xts <- xts(z$PrecipQuantity_6hSum, z$DateUtc) 
     ends <- endpoints(z.xts, "hours", 6) 
     precip6 <- as.data.frame(period.apply(z.xts, ends, sum)) 
     precip6$DateUtc <- rownames(precip6) 
     rownames(precip6) <- NULL 
     return(precip6) 
    }) 
+0

Ах спасибо за место, я отредактирую. Поэтому просто для подтверждения, когда вы запускаете код 'ddply', он возвращает непустую' df'? – hanwick1

+0

Я получаю пустой 'df' только потому, что именно так определяется' df'. Выполняется код 'ddply'. Я думаю, может быть, вам просто нужно написать 'df <- ddply (...'. –

+0

Да, это работает с воспроизводимыми примерами данных, но не с моими реальными данными. Думаю, это проблема с данными, и мне понадобится поближе посмотрим на это. Спасибо за вашу помощь. – hanwick1

Смежные вопросы