如何使用apply.daily / period.apply计算XTS时间序列中每列的最大值?

时间:2018-08-01 00:21:57

标签: r time-series xts

对于高分辨率时间序列分析,我在使用encode函数时遇到问题。

我想以10分钟为间隔为我的数据计算统计信息(不同时期的平均值,Stddev等)。按小时计算意味着工作正常,如this answer中所述。

它将创建一个新的xts对象,并为每一列计算平均值。如何计算每一列的最大值?

这个可重现的示例描述了我的数据结构:

period.apply

我认为将函数参数从library(xts) start <- as.POSIXct("2018-05-18 00:00") tseq <- seq(from = start, length.out = 1440, by = "10 mins") Measurings <- data.frame( Time = tseq, Temp = sample(10:37,1440, replace = TRUE, set.seed(seed = 10)), Variable1 = sample(1:200,1440, replace = TRUE, set.seed(seed = 187)), Variable2 = sample(300:800,1440, replace = TRUE, set.seed(seed = 333)) ) Measurings_xts <- xts(Measurings[,-1], Measurings$Time) HourEnds <- endpoints(Measurings_xts, "hours") Measurings_mean <- period.apply(Measurings_xts, HourEnds, mean) 更改为mean会很容易,就像这样:

max

它提供输出,但只有一列具有整体最大值。我需要每列的每小时最大值。一个简单的解决方案将不胜感激。

1 个答案:

答案 0 :(得分:2)

mean示例按列工作,因为每个列上都有一个Zoo方法调用mean(使用此方法是因为xts扩展了zoo)。

max示例返回一个数字,因为没有max.xtsmax.zoo方法,因此它返回整个xts / zoo对象的最大值。

一个简单的解决方案是定义一个辅助函数:

colMax <- function(x, na.rm = FALSE) {
  apply(x, 2, max, na.rm = na.rm)
}

然后在您的period.apply通话中使用它:

epHours <- endpoints(Measurings_xts, "hours")
Measurings_max <- period.apply(Measurings_xts, epHours, colMax)
head(Measurings_max)
#                     Temp Variable1 Variable2
# 2018-05-18 00:50:00   29       194       787
# 2018-05-18 01:50:00   28       178       605
# 2018-05-18 02:50:00   26       188       756
# 2018-05-18 03:50:00   34       152       444
# 2018-05-18 04:50:00   33       145       724
# 2018-05-18 05:50:00   35       187       621