У меня есть данные о прогнозе погоды, в которых записывается прогноз количества осадков за каждый час. Я хотел бы сравнить это с данными наблюдений, в которых наблюдалось количество осадков на каждые 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)
Не должен ли ваш воспроизводимый пример быть 'data.frame', а не' cbind'? Так как он создает матрицу символов –
Да, вы правы, спасибо! Ред. – hanwick1
Я также не могу воспроизвести вашу ошибку; когда я запускаю один и тот же воспроизводимый код, я получаю кадр данных с столбцом V1, который является «NA». Это похоже на проблему, но я также получаю NA, когда подмножество для одной станции перед использованием 'period.apply'. Попробуйте запустить воспроизводимый пример и убедитесь, что он дает вам такую же ошибку. (Я подозреваю, что с помощью cbind вы не пробовали только один воспроизводимый пример :) –