在R中对时间序列数据进行分割-应用聚合

4

我有一些天气预报数据,记录了每小时的降雨预测量。 我想将其与观测数据进行比较,后者记录了每6个小时的观测降雨量。 因此,我需要将预测数据聚合为每6小时一次的数据。

以下是我的数据概述:

                     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 吗?因为它会创建一个字符矩阵。 - David Robinson
是的,你说得对,谢谢!已编辑。 - hanwick1
我也无法重现你的错误;当我运行相同可重现的代码时,我得到一个数据框,其中一列V1全部为NA。这似乎是个问题,但在使用period.apply之前,当我对一个站点进行子集操作时,我也会得到NAs。请尝试运行您的可重现示例,并查看是否出现相同的错误。(我怀疑您使用cbind,还没有尝试过仅使用可重现的示例 :)) - David Robinson
@DavidRobinson 嗯,你说得对,我应该先尝试运行可重现的示例 :) 我刚刚尝试了一下,没有出现帖子中描述的错误,但它也返回了一个空的 df。 你有同样的问题吗? - hanwick1
1个回答

0

我认为David Robinson遇到的错误是因为你的示例代码使用了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)
    })

啊,谢谢你指出来,我会修改的。所以确认一下,当你运行ddply代码时,它返回一个非空的df吗? - hanwick1
我只得到空的 df,因为这就是 df 最初的定义方式。ddply 代码是有效的。我认为你只需要编写 df <- ddply(... - johnson-shuffle
是的,它可以使用可重现的示例数据,但无法使用我的真实数据。我猜这是数据的问题,我需要仔细检查一下。感谢您的所有帮助。 - hanwick1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接