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

How to use apply.daily/period.apply for calculating maximum per column in XTS time series?

我在使用 period.apply 函数进行高分辨率时间序列分析时遇到问题。

我想为我的数据计算统计数据(不同时期的平均值、Stddev 等),间隔为 10 分钟。每小时计算意味着工作正常,如 this answer.

中所述

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

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

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 会很容易,如下所示:

Measurings_max <- period.apply(Measurings_xts, HourEnds, max)

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

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

max例子returns一个数因为没有max.xtsmax.zoo方法,所以returns整个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