寻找更优雅的是使用动物园将每小时数据汇总到每小时数据

时间:2014-10-01 18:57:40

标签: r zoo

我有一大块数据记录温度来自几十个设备每小时超过一年。数据存储为zoo对象。我非常希望通过查看一天中24小时(凌晨1点,凌晨2点,凌晨3点等)的每一天的平均值来总结这些数据。因此,对于每个设备,我可以看到它的平均值是1am倍,2am倍,等等。我可以通过循环来做到这一点,但感觉必须有一种方法在动物园中巧妙地使用aggregate.zoo。有什么帮助吗?

require(zoo)
# random hourly data over 30 days for five series
x <- matrix(rnorm(24 * 30 * 5),ncol=5)
# Assign hourly data with a real time and date
x.DateTime <- as.POSIXct("2014-01-01 0100",format = "%Y-%m-%d %H") + 
  seq(0,24 * 30 * 60 * 60, by=3600)
# make a zoo object
x.zoo <- zoo(x, x.DateTime)
#plot(x.zoo)

# what I want:
# the average value for each series at 1am, 2am, 3am, etc. so that
# the dimensions of the output are 24 (hours) by 5 (series)
# If I were just working on x I might do something like:
res <- matrix(NA,ncol=5,nrow=24)
for(i in 1:nrow(res)){
  res[i,] <- apply(x[seq(i,nrow(x),by=24),],2,mean)
}
res
# how can I avoid the loop and write an aggregate statement in zoo that 
# will get me what I want?

2 个答案:

答案 0 :(得分:4)

计算每个时间点的小时数,然后按以下方式汇总:

hr <- as.numeric(format(time(x.zoo), "%H"))
ag <- aggregate(x.zoo, hr, mean)
dim(ag)
## [1] 24  5

<强> ADDED

交替使用来自chron的hours或来自data.table的hour

library(chron)
ag <- aggregate(x.zoo, hours, mean)

答案 1 :(得分:2)

这与其他答案非常相似,但利用了by=...的{​​{1}}参数可以作为将应用于aggregate.zoo(...)的函数的事实:

time(x.zoo)

请注意,这会产生与其他答案相同的结果,而不是与您的相同。这是因为您的数据集从凌晨1:00开始,而不是午夜,因此您的循环生成一个矩阵,其中第一行对应于凌晨1:00,最后一行对应午夜。这些解决方案产生动物园对象,其中第一行对应于午夜。