我在将移动窗口函数应用于时间序列数据集时遇到了问题。我已将每日流量数据(日期和值)导入到动物园对象中,如下所示:
library(zoo)
df <- data.frame(sf = c("2001-04-01", "2001-04-02", "2001-04-03", "2001-04-04",
"2001-04-05", "2001-04-06", "2001-04-07", "2001-06-01",
"2001-06-02", "2001-06-03", "2001-06-04", "2001-06-05",
"2001-06-06"),
cfs = abs(rnorm(13)))
zoodf <- read.zoo(df, format = "%Y-%m-%d")
由于我想计算每个月的3天移动最小值,我已经使用rollapply定义了一个函数:
f.3daylow <- function(x){rollapply(x, 3, FUN=min, align = "center")}
然后我使用聚合:
aggregate(zoodf, by=as.yearmon, FUN=f.3daylow)
这会立即返回错误消息:
Error in zoo(df, ix[!is.na(ix)]) :
“x” : attempt to define invalid zoo object
问题似乎是每个月都有不等数量的数据点,因为使用相同的数据帧以及6月的额外日期会产生正确的响应。任何有关如何处理此事的建议都将不胜感激!
答案 0 :(得分:1)
好的,你可能会想到这样的事情。它将每个月的结果粘贴到一个数据点,以便可以在聚合函数中返回。否则,您可能还需要查看?aggregate.zoo
以获得更精确的数据操作。
f.3daylow <- function(x){paste(rollapply(x, 3, FUN=min,
align = "center"), collapse=", ")}
data <- aggregate(zoodf, by=as.yearmon, FUN=f.3daylow)
返回,这是一个3的滚动窗口,复制到1个数据点。要分析它,最终你将不得不再次将其分解,因此不建议这样做。
Apr 2001
0.124581285281643, 0.124581285281643, 0.124581285281643,
0.342222172241979, 0.518874882033892
June 2001
0.454158221843514, 0.454158221843514, 0.656966528249837,
0.513613009234435
最后,您可以通过strsplit(data[1],", ")
再次进行剪切,但有关详细信息,请参阅Convert comma separated entry to columns。