在R 语言中,如何使用zoo包的rollapply函数中的by参数来处理不规则时间序列
我有以1 秒为间隔的天气观测数据。我想用一个自定义函数按每分钟聚合一次(即12:01上午、12:02上午等),使用zoo包中的rollapply函数。rollapply函数有一个 "by" 参数,可以让我指定需要60秒的区间,但我希望每完整一分钟就向上滚动一次,而不是在过去60秒内每秒都进行一次连续滚动。
我也有不规则数据,也就是说有些秒缺失,因此并非每一分钟都完整包含60秒。我的问题是:如何使用zoo的 rollapply函数来实现这一点?下面有一些示例数据,以及我在CRAN上的zoo包 PDF中尝试的代码,但它没有达到我的期望,而且我承认自己在跟着它时有点困难。
library(zoo)
tt <- zoo(format(seq(ymd_hms('2020-01-01 00:00:00'), ymd_hms('2020-01-01 00:02:00'), '1 sec'), '%Y-%m-%d %H:%M:%S'))
z <- zoo(runif(121,1,10))
zm <- merge(z, tt)
output <- rollapply(zm, 60, mean, by = 60) # does not work
我想要的输出应该是在2020-01-01的分钟0、1、2三行。我现在用一个for循环来解决这个问题,但速度很慢。非常感谢任何帮助。
解决方案
那段代码是在对字符字符串求均值,因此让我们把示例改为数值输入,并确保使用 set.seed 以便可复现。
你真正需要的是 aggregate,而不是 rollapply。向下截断到分钟,然后按该分钟聚合。
library(lubridate)
library(zoo)
# test data.
set.seed(13)
z <- zoo(runif(121, 1, 10), ymd_hms('2020-01-01 00:00:00') + 0:120)
z <- z[-c(50, 55)] # remove 2 points from first minute so it is irregularly spaced
aggregate(z, floor_date(time(z), 'minute'), mean)
## 2020-01-01 00:00:00 2020-01-01 00:01:00 2020-01-01 00:02:00
## 5.374209 5.569611 1.931959
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。