2015-08-21 70 views
2

假設我想使用函數返回多於一個值的函數使用rollapply。像這樣:使用函數返回多個值的函數

library(quantmod) 
getSymbols("YHOO") 

openYHOO <- YHOO[1:10,1] 

rollapply(openYHOO, width = 2, range) 

我得到一個錯誤。 我也嘗試合併函數內部的結果:

rollapply(openYHOO, width = 2, function(x) { 
    cbind(range(x)) 
}) 

rollapply(openYHOO, width = 2, function(x) { 
    merge(range(x)) 
}) 

更多的錯誤。
我可以這樣做:

cbind(
    rollapply(openYHOO, width = 2, function(x) { 
    range(x)[1] 
    }), 
    rollapply(openYHOO, width = 2, function(x) { 
    range(x)[2] 
    }) 
) 

...和它的作品。

但是,如果我想調用fivenum或者在有趣的參數中使用更復雜和計算密集的東西,該怎麼辦?我是否需要爲每個想返回的值調用rollapply,並一遍又一遍地生成同一個對象?

我錯過了什麼,或者我應該放棄rollapply和滾動我自己的滾動窗口功能?

你能解釋爲什麼這個rollapply(openYHOO, width = 2, range)不起作用嗎?

回答

3

使用by.column參數

rollapply(openYHOO, width=2, range, by.column=FALSE) 
#   [,1] [,2] 
#2007-01-03 NA NA 
#2007-01-04 25.64 25.85 
#2007-01-05 25.64 26.70 
#2007-01-08 26.70 27.70 
#2007-01-09 27.70 28.00 
#2007-01-10 27.48 28.00 
#2007-01-11 27.48 28.76 
#2007-01-12 28.76 28.98 
#2007-01-16 28.98 29.88 
#2007-01-17 29.40 29.88 

> rollapply(openYHOO, width=2, 
      function(x) fivenum(as.numeric(x)), 
      by.column=FALSE) 
#   [,1] [,2] [,3] [,4] [,5] 
#2007-01-03 NA NA  NA NA NA 
#2007-01-04 25.64 25.64 25.745 25.85 25.85 
#2007-01-05 25.64 25.64 26.170 26.70 26.70 
#2007-01-08 26.70 26.70 27.200 27.70 27.70 
#2007-01-09 27.70 27.70 27.850 28.00 28.00 
#2007-01-10 27.48 27.48 27.740 28.00 28.00 
#2007-01-11 27.48 27.48 28.120 28.76 28.76 
#2007-01-12 28.76 28.76 28.870 28.98 28.98 
#2007-01-16 28.98 28.98 29.430 29.88 29.88 
#2007-01-17 29.40 29.40 29.640 29.88 29.88 
+0

這工作。謝謝。不是我所期望的「by.column \t邏輯」的幫助文檔描述,如果TRUE,FUN分別應用於每個列。但是文檔中的示例確實顯示了我正在查找的行爲。適合我的例子:'rollapply(openYHOO,width = 3,FUN = function(x)coef(lm(x〜seq_along(x))),by.column = FALSE,align =「right」)' – brandco