2012-03-02 3 views
2

Как я мог избежать для XTS цикла вычисления взвешенной суммы, как я пытаюсь сделать ниже:Как избежать цикла при вычислении взвешенной суммы xts?

library(xts) 

thetaSum <- function(theta, w=c(1, 1, 1)) { 
    sum(coredata(theta)*rev(w)) 
} 

n <- 10 
tmpVec <- rep(1, n) 
tmpDates <- seq(as.Date("2000-01-01"), length = n, by = "day") 
theta <- xts(tmpVec, order.by=tmpDates) 

N <- 3 
thetaSummed <- xts(rep(NA, n), order.by=tmpDates) 

for (i in N:n) { 
    thetaTemp <- theta[(i-N+1):i, ] 
    thetaSummed[i] <- thetaSum(thetaTemp, w=rep(1, N)) 
} 

thetaSummed 

N оглянуться период меньше, чем п.

Каковы некоторые быстрые альтернативы для цикла?

ответ

3

Вы можете использовать rollapply.

rollapplyr(theta, width=3, FUN=thetaSum, fill=NA) 
+0

Просто расширить на том, что: 'rollapplyr' обертка для' rollapply', что делает 'ALIGN = "вправо"' (т.е. '(я-N + 1): i' в исходном коде) , По умолчанию 'rollapply' делает' align = "center" ', и добавив' align = "left" ', он будет делать эквивалент' i: i + 2' в вашем коде (если вы также измените цикл на 'for (i в 1: (n-N + 1)) {...} ') –

 Смежные вопросы

  • Нет связанных вопросов^_^