r - 在 start= 和 end= 上向量化 window.zoo

标签 r vectorization zoo

我的输入数据看起来像这样(在示例中减少到两个时间序列)。

library(zoo)
begin <- as.Date(c('2003-02-12', '2003-01-23'))
end <- as.Date(c('2003-10-02', '2003-08-01'))
x.Date <- as.Date("2003-01-01") + seq(1, 365, 8) - 1
data <- matrix(rnorm(length(x.Date)*2), ncol = 2, dimnames = list(r = NULL, col = c('a', 'b')))

我正在尝试编写一个函数,对于每个时间序列 (x[,i]),对由 begin[i] 和 end[i] 定义的窗口的值求平均值。

fun <- function(data, begin, end, dates) {
  x <- zoo(data, dates)
  xSub <- window(x, start = begin, end = end)
  colMeans(xSub, na.rm = TRUE)
}

如果提供单个时间序列,则上述函数(或稍作修改的版本)可以工作,但未在 beginend 上正确矢量化。知道我如何才能做到这一点吗?

# Slightly modified version working for single time-series
fun2 <- function(data, begin, end, dates) {
  x <- zoo(data, dates)
  xSub <- window(x, start = begin, end = end)
  mean(xSub, na.rm = TRUE)
}

fun2(data[,1], begin[1], end[1], x.Date) # OK

fun(data, begin, end, x.Date) # Same window is used for both time-series

该函数应该重现此循环的行为。

out <- c()
for(i in 1:ncol(data)) {
  x <- zoo(data[,i], x.Date)
  xSub <- window(x, start = begin[i], end = end[i])
  out <- c(out, mean(xSub))  
}

谢谢, 卢伊克

最佳答案

创建要使用的动物园对象,将其转换为动物园对象列表并对其进行Map(或mapply)。

z <- zoo(data, x.Date)
Map(window, as.list(z), start = begin, end = end)

请注意,关键是使用 as.list,而不是 list

关于r - 在 start= 和 end= 上向量化 window.zoo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28517902/

相关文章:

javascript - 将 Shiny 的reactive()值传递到DT的javascript部分

r - 使具有许多观察结果的多组线图更具可读性

matlab - 如何遍历 matlab 中矩阵的列并将它们分别添加到 matlab 中求和矩阵的特定列?

r - data.table 给出错误 Error : k <= n is not TRUE

r - 创建具有自定义开始时间的每日 OHLC

r - 将第 1-12 周改为第 1 季度

r - 一般线性混合效应 (glmer) 异方差建模

c++ - 我们是否需要在 C++ 中进行矢量化,或者 for 循环是否已经足够快?

python - 如何对不同大小的向量进行向量化运算

r - 填写缺失的时间步长 (yyyy-mm-dd HH :MM:SS) by adding rows with missing times in R