R中时间序列数据的拆分应用聚合
Posted
技术标签:
【中文标题】R中时间序列数据的拆分应用聚合【英文标题】:Split-apply aggregation of time series data in R 【发布时间】:2015-10-03 04:04:00 【问题描述】:我有一些天气预报数据,它记录了每小时的预测降雨量。我想将此与观测数据进行比较,观测数据具有每 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
?因为它创建了一个字符矩阵
是的,你是对的,谢谢!已编辑。
我也无法重现您的错误;当我运行相同的可重现代码时,我得到一个数据框,其列 V1 全部为 NA
。这似乎是一个问题,但是当我在使用period.apply
之前为一个站设置子集时,我也会得到 NA。请尝试运行您的可重现示例,看看它是否给您同样的错误。 (我怀疑使用 cbind 你没有单独尝试过可重现的示例:)
@DavidRobinson 嗯,你是对的,我应该先尝试运行可重现的示例 :) 刚刚试了一下,我没有收到帖子中描述的错误,但它也返回一个空的 @ 987654335@。你也一样吗?
【参考方案1】:
我认为 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
?
我得到空的df
只是因为df
最初是这样定义的。 ddply
代码有效。我想也许你只需要写df <- ddply(...
。
是的,它适用于可重现的示例数据,但不适用于我的真实数据。我想这是数据的问题,我需要仔细研究一下。感谢您的所有帮助。以上是关于R中时间序列数据的拆分应用聚合的主要内容,如果未能解决你的问题,请参考以下文章