在 start= 和 end= 上向量化 window.zoo
Vectorize window.zoo over start= and end=
我有这样的输入数据(例如减少为两个时间序列)。
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] 定义的 window 的值的平均值。
fun <- function(data, begin, end, dates) {
x <- zoo(data, dates)
xSub <- window(x, start = begin, end = end)
colMeans(xSub, na.rm = TRUE)
}
如果提供单个时间序列,上述函数(或稍作修改的版本)可以工作,但未在 begin
和 end
上正确矢量化。知道我该怎么做吗?
# 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))
}
谢谢,
洛伊克
另一个答案真正展示了矢量化解决方案如何完成 for 循环所做的任何事情。
fun <- function(data, begin, end, dates) {
x <- zoo(data, dates)
paircount <- 1:length(begin)
sapply(paircount, function(i) mean(window(x[,i], start=begin[i], end=end[i]), na.rm=TRUE))
}
mapply
可能是最好的方法。
fun <- function(data, begin, end, dates) {
x <- zoo(data, dates)
step1 <- mapply(window, start=begin, end=end, MoreArgs=list(x=x))
sapply(step1, colMeans, na.rm=TRUE)
}
创建要使用的动物园对象,将其转换为动物园对象列表,然后Map
(或mapply
)覆盖它。
z <- zoo(data, x.Date)
Map(window, as.list(z), start = begin, end = end)
注意关键是使用as.list
,而不是list
。
我有这样的输入数据(例如减少为两个时间序列)。
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] 定义的 window 的值的平均值。
fun <- function(data, begin, end, dates) {
x <- zoo(data, dates)
xSub <- window(x, start = begin, end = end)
colMeans(xSub, na.rm = TRUE)
}
如果提供单个时间序列,上述函数(或稍作修改的版本)可以工作,但未在 begin
和 end
上正确矢量化。知道我该怎么做吗?
# 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))
}
谢谢, 洛伊克
另一个答案真正展示了矢量化解决方案如何完成 for 循环所做的任何事情。
fun <- function(data, begin, end, dates) {
x <- zoo(data, dates)
paircount <- 1:length(begin)
sapply(paircount, function(i) mean(window(x[,i], start=begin[i], end=end[i]), na.rm=TRUE))
}
mapply
可能是最好的方法。
fun <- function(data, begin, end, dates) {
x <- zoo(data, dates)
step1 <- mapply(window, start=begin, end=end, MoreArgs=list(x=x))
sapply(step1, colMeans, na.rm=TRUE)
}
创建要使用的动物园对象,将其转换为动物园对象列表,然后Map
(或mapply
)覆盖它。
z <- zoo(data, x.Date)
Map(window, as.list(z), start = begin, end = end)
注意关键是使用as.list
,而不是list
。