我有一个观察间距不等的数据集,经常每天观察一次以上。我想将一个函数应用于我的数据窗口,但我希望窗口是按时间而不是按行定义的。例如,我想在我的数据集中计算第1-5天,第2-6天等的平均值,第1-5天可能对应于第1-13行,第2-6天对应于行3-18等。
我看到rollapply
函数接受zoo
个对象,我认为它可以像我上面描述的那样工作(即在由时间定义的窗口上应用函数而不是由行定义的窗口)。但是,情况似乎并非如此:
my.ts = zoo( 1:100, as.Date("201401","%Y%j")+1:100 )
mean1 = rollapply( my.ts, 3, mean, align="right" )
my.ts = zoo( 1:100, as.Date("201401","%Y%j")+1:100/2 )
mean2 = rollapply( my.ts, 3, mean, align="right" )
all( mean1==mean2 )
我希望mean2
与mean1
不同,因为mean2
每天有两次观察,而不是一次。但是,rollapply
似乎使用行来定义窗口而不是zoo
对象的时间。有解决办法吗?或者,我应该使用其他一些功能代替rollapply
?
答案 0 :(得分:5)
rollapply
中记录了 ?rollapply
,因此无需猜测其工作原理。
做你想做的事情用NAs填写缺失的日子,然后执行平均值。例如,每三天做一次平均而不是每三次观察:
library(zoo)
# test data
tt <- as.Date("2000-01-01") + c(1, 2, 5, 6, 7, 8, 10)
z <- zoo(seq_along(tt), tt)
# fill it out to a daily series, zm, using NAs
g <- zoo(, seq(start(z), end(z), "day")) # zero width zoo series on a grid
zm <- merge(z, g)
rollapply(zm, 3, mean, na.rm = TRUE, fill = NA)