矢量化window.zoo over start=和end=
我有这样的输入数据(示例中简化为两个时间序列) 该函数应再现此循环的行为矢量化window.zoo over start=和end=,r,vectorization,zoo,R,Vectorization,Zoo,我有这样的输入数据(示例中简化为两个时间序列) 该函数应再现此循环的行为 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)) } out另一个答案,它真实地展示了向量化解决方案如何做for循环所做的任何事情 fun <- fu
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))
}
out另一个答案,它真实地展示了向量化解决方案如何做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))
}
funmappy
可能是最好的方法
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)
}
fun创建要使用的动物园对象,将其转换为动物园对象列表,并在其上绘制Map
(或mapply
)
z是否要传递一个开始值向量和一个结束值向量,并让函数返回一个向量,其值是逐对计算的结果?@J.Won。这正是我想要实现的。我编辑了这个问题来说明这一点。也许,请参见mappy
:mappy(函数(j,b,e)fun2(数据[,j],b,e,x.Date)),seq_len(ncol(数据)),begin,end)
谢谢,我喜欢这个,效果很好。略加修改。是的,这是我最初的做法。不过,要使用mapply调用中的x
变量,需要将window
矢量化。但是,在x
的正确维度上对其进行矢量化听起来并不容易。我们对每一对begin
/end
进行评估,但只对x
的一个值进行评估。这就是为什么在MoreArgs列表中分别传递x
。
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))
}
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))
}
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)
}
z <- zoo(data, x.Date)
Map(window, as.list(z), start = begin, end = end)