2017-04-19 27 views
1

我有一個大的xts,我想根據月份和日期過濾每年的禮物。更快的方法子集xts

library(xts) 
junk <- xts(sample.int(101, size = 1461, replace = T), seq(as.Date('2006-01-01'), as.Date('2009-12-31'), 'days')) 
junk_sma10 = TTR::SMA(x = junk, n = 10) ## trailing 10 day avg 

現在我正在通過一個循環爲每一天和每月的價值,這需要一段時間的值。我知道R一次更好地處理媒介。

months_filtered <- idx_apcp30[.indexmon(junk_sma10) == 1]  ## filter for feb 
final_filtered <- months_filtered[.indexmday(months_filtered) == 15] ## filter for 16th 

輸出是一年中每一天的獨特xts。

  SMA 
2006-02-16 61.0 
2007-02-16 50.5 
2008-02-16 60.5 
2009-02-16 54.1 

,然後下一次迭代(+1 MDAY)將產生

  SMA 
2006-02-17 64.3 
2007-02-17 48.4 
2008-02-17 66.1 
2009-02-17 48.6 

我需要製作並存儲每個XTS,這個過程中產生的。我如何做到這一點不循環?

我發現了這樣一個解決方案:

junk[seq(as.Date('2006-01-01'),as.Date('2009-12-31'),by='year')] 

但我還是會每天都遍歷...

回答

1

一個簡單的解決方案是split您的XTS對象成塊的月和日。

# if using xts < 0.10-0 (bug work-around) 
month_day <- split(junk_sma10, as.numeric(format(index(junk_sma10), "%m%d"))) 

# requires xts >= 0.10-0 
month_day <- split(junk_sma10, format(index(junk_sma10), "%m%d")) 

現在month_day是一個列表,其中每個元素都是相同的月份和日期的月份,每年爲。然後,您可以繼續使用lapply來調用每個列表元素上的函數。