2014-05-18 41 views
0

我有幾年的每日價格數據作爲動物園對象。 R中每個月最後一週的最佳方法是什麼?如何在R中的動物園對象的每個月的最後一週進行子集分類?

這裏是你如何能複製它:

set.seed(123) 
price <- rnorm(365) 
data <- cbind(seq(as.Date("2013-01-01"), by = "day", length.out = 365), price) 
zoodata <- zoo(data[,2], as.Date(data[,1])) 

我試過這個選項,但它只返回整個數據集的最後一週。

do.call(rbind, lapply(split(zoodata, "months"), last, "1 week")) 

結果輸出是:

2013-12-30 2013-12-31 
1.0246732 0.8176594 

,我希望能得到每月的最後一個星期,所以應該至少12周的數據。

在此先感謝!

+2

請閱讀[this](http://stackoverflow.com/questions/5963269/how-如何製作一個很好的可重現的示例),以瞭解如何爲您的問題創建一個最小可重現的示例。你還應該展示你迄今爲止所嘗試的以及你失敗的地方。 –

+0

感謝您的耐心等待。我添加了代碼以使其具有可重現性。 – user3584057

回答

2

下面是一個使用XTS包

## Create sample data 
library(xts) 
data(sample_matrix) 
x <- as.xts(sample_matrix) 
## 

# split by month, and apply the last() function to each group 
lapply(split(x, "months"), last, "1 week") 

如果你想要的結果是一個單一對象的方式,你可以使用do.call

do.call(rbind, lapply(split(x, "months"), last, "1 week")) 
       Open  High  Low Close 
2007-01-29 49.85624 49.93038 49.76308 49.91875 
2007-01-30 49.85477 50.02180 49.77242 50.02180 
2007-01-31 50.07049 50.22578 50.07049 50.22578 
2007-02-26 50.88168 50.88168 50.75481 50.75481 
2007-02-27 50.74333 50.78909 50.61874 50.69206 
2007-02-28 50.69435 50.77091 50.59881 50.77091 
2007-03-26 48.34210 48.44637 48.28969 48.28969 
2007-03-27 48.25248 48.41572 48.23648 48.30851 
2007-03-28 48.33090 48.53595 48.33090 48.53595 
2007-03-29 48.59236 48.69988 48.57432 48.69988 
2007-03-30 48.74562 49.00218 48.74562 48.93546 
2007-03-31 48.95616 49.09728 48.95616 48.97490 
2007-04-30 49.13825 49.33974 49.11500 49.33974 
2007-05-28 47.90142 47.93398 47.64718 47.64718 
2007-05-29 47.65665 47.89342 47.65446 47.87252 
2007-05-30 47.78866 47.93267 47.78866 47.83291 
2007-05-31 47.82845 47.84044 47.73780 47.73780 
2007-06-25 47.20471 47.42772 47.13405 47.42772 
2007-06-26 47.44300 47.61611 47.44300 47.61611 
2007-06-27 47.62323 47.71673 47.60015 47.62769 
2007-06-28 47.67604 47.70460 47.57241 47.60716 
2007-06-29 47.63629 47.77563 47.61733 47.66471 
2007-06-30 47.67468 47.94127 47.67468 47.76719 

rbind名單:如果是重要的,你可以圍繞它包裝as.zoo(),但xts對象是zoo對象,所以可能沒有必要。

+0

謝謝GSee。我嘗試了您的修復程序,但它對我無效。我只得到整個一年的最後一週。我在原始條目中添加了代碼以使其具有可重現性。 – user3584057

+0

@ user3584057您需要首先轉換爲「xts」。 'x < - as.xts(zoodata)' – GSee

+0

明白了。這出來乾淨:do.call(rbind,lapply(分裂(as.xts(zoodata),「月」),最後,「1周」)) - 謝謝! – user3584057

0

嘗試

lapply(split(as.xts(zoodata), "months"), FUN = function(x) last(x,"1 week")) 

這近一週給予每月。 (但數據將在月底日期結束,因爲本月的最後一天可能在一週中的任何一天結束)

+0

我正在尋找的確切解決方案;奇妙地工作。謝謝! – user3584057

+0

和我的一樣,但更多擊鍵。 – GSee

相關問題