在R时间序列中每年汇总天数
问题描述:
我有一个多年(1985-2010)时间序列的日常数据,我希望以8天的间隔汇总。问题是,我很感兴趣,分析年度业绩,所以每年的第一区间应在1月1日在R时间序列中每年汇总天数
开始如果你建造一个例子动物园对象:
library(zoo)
indices <- seq.Date(as.Date("1985-01-01"), as.Date("1988-12-31"), by = 'day')
a.zoo <- zoo(rnorm(length(indices)), order.by = indices)
head(a.zoo)
1985-01-01 1985-01-02 1985-01-03 1985-01-04 1985-01-05 1985-01-06
0.47454560 -1.10429098 -1.27926702 0.46199385 -0.12975014 0.03752185
那么我就可以rollapply使用以获得部分途径:
rollapply(a.zoo, 8, by=8, by.column=FALSE, FUN=function(x) mean(x), align = "left")
但是年份之间没有区别,所以第一个年度间隔的开始日期各不相同。如果我变换动物园对象转换为数据帧我可以用一个plyr命令逐年应用功能:
library(plyr)
a.df <- data.frame(date = time(a.zoo),
data = a.zoo,
check.names = F,
row.names = NULL)
a.8 <- dlply(a.df, .(format(date, "%Y")),
function(x) {split(x$data, ceiling(seq_along(x$data)/8))})
a8.mean <- rapply(a.8, mean, na.rm = T)
head(a8.mean)
1985.1 1985.2 1985.3 1985.4 1985.5 1985.6
-0.2744355 0.3103211 0.2057675 -0.1537141 0.6807115 -0.1581474
,但我失去的最新信息。对于如何调整一种方法或其他方法(或者可以提供一个新的更精彩的想法),是否有人有任何建议,以便每年从1月1日起每隔8天结束一次带有时间标记的数据?谢谢你的帮助!
答
我对此解决方案使用了此SO回答。通过一年基本上划分zoo
对象:
a.yr = tapply(a.zoo, format(index(a.zoo), "%Y"), c)
然后申请rollapply
你在做,每年可为。
rollapply(a.yr$`1985`, 8, by=8, by.column=FALSE, FUN=function(x) mean(x), align = "left")
然后,您可以merge
动物园的对象。
答
这可能不是最好的答案,但你可以为你的第二个方法提取的名称,然后将其分配给您的a8.mean
结果
a8.name <- (dlply(a.df, .(format(date, "%Y")), function(x) x$date[seq_along(x$date) %% 8 == 1]))
names(a8.mean) <- do.call(c, a8.name)
+0
这也适用!在'do.call'命令中,名称被删除了“日期”格式,但将结果转换为动物园对象很容易:a8.mean.zoo Jaywalker
谢谢!这使我走上了正轨。为了适用于所有年份(而不仅仅是上面的'1985'),我使用了lapply:'a.list Jaywalker