2011-09-02 36 views
3

我有日常數據動物園對象稱爲PP和77列,看起來像這樣:如何在動物園對象使用`apply.monthly`有幾列

  X02R X03N X04K X04N X04R X06I X06N X08J X08P X09O X11O X12L X14N X15G X16K (...) 
1961-01-01 8.3 5.2 3.2 0.0 8.7 5.2 15.0 7.2 11.5 13.0 0.0 4.9 0.0 2.9 6.0 
1961-01-02 1.1 3.2 10.0 0.0 0.0 3.5 0.0 8.7 0.4 1.2 0.0 0.4 0.0 3.2 0.2  
1961-01-03 12.0 4.2 50.5 0.0 9.0 38.5 15.0 31.7 1.7 8.7 9.0 69.2 4.2 22.2 9.2 
(...) 

我想用apply.monthly每個的列,所以最後我仍然有77列,但與每月數據,而不是每日數據。我試圖 apply.monthly(pp, FUN=sum)但結果是隻有一列(我想是將所有的列)動物園的對象。

我也試過一個循環:

for (i in 1:77) { mensal<-apply.monthly(pp[,i], FUN=sum) } 但它也帶來一個列(77列)。我也許能做出一些嘗試和錯誤的循環工作,但它需要年齡計算(我有17897行和77列),我想有這樣做不使用循環的一個簡單的方法......所以如果你知道如何,請幫助。謝謝!

回答

4

爲了使apply.monthly返回一列以上的對象,必須使用按列操作的函數(或apply這是一個不支持的函數)。

library(quantmod) 
getSymbols("SPY") 
zSPY <- as.zoo(SPY) 
# sum doesn't operate by column; it sums everything to one value 
sum(zSPY) 
spy.sum <- apply.monthly(zSPY, sum) 
# colSums operates by column 
spy.colSums <- apply.monthly(zSPY, colSums) 
# use apply to operate by column 
spy.apply.sum <- apply.monthly(zSPY, apply, 2, sum) 
+1

我也得到1列。我得到錯誤,直到我更新。它確實需要重新啓動或分離() - /(重新)require() - 更新後駐留的所有軟件包。嘗試用FUN = sum提供的結構。 (將在答案框中發佈dput()輸出。) –

+0

@Dwin:謝謝,我會更新。 –

+0

你知道爲什麼你的SPY例子沒有崩潰嗎? sum()日期或索引沒有多大意義,但last()對於有序索引可能有自然的解釋? –

0

這只是一個可重複的例子。創建了:

dat <- read.zoo(textConnection("date X02R X03N X04K X04N X04R X06I X06N X08J X08P X09O X11O X12L X14N X15G X16K 
1961-01-01 8.3 5.2 3.2 0.0 8.7 5.2 15.0 7.2 11.5 13.0 0.0 4.9 0.0 2.9 6.0 
1961-01-02 1.1 3.2 10.0 0.0 0.0 3.5 0.0 8.7 0.4 1.2 0.0 0.4 0.0 3.2 0.2 
1961-01-03 12.0 4.2 50.5 0.0 9.0 38.5 15.0 31.7 1.7 8.7 9.0 69.2 4.2 22.2 9.2"), header=TRUE) 

dput(DAT) 結構(C(8.3,1.1,12,5.2,3.2,4.2,3.2,10,50.5,0,0, 0,8.7,0, 9,5.2,3.5,38.5,15,0,15,7.2,8.7,31.7,11.5, 0.4,1.7,13,1.2,8.7,0,0,9,4.9,0.4,69.2,0,0,4.2 ,2.9,3.2 ,22.2mmol,6,0.2,9.2),.dim僞= C(3L,15L),.Dimnames =列表( NULL,C( 「X02R」, 「X03N」, 「X04K」, 「X04N」 「X04R」, 「X06I」, 「X06N」, 「X08J」, 「X08P」, 「X09O」, 「X11O」, 「X12L」, 「X14N」, 「X15G」, 「X16K」 )),指數=結構(C(-3287,-3286,-3285)中,class = 「日期」),類= 「動物園」)

但現在,我有辦法重新創建的錯誤,也許我可以提供一個測試的解決方案:

ldat <-lapply(dat, FUN=apply.monthly, sum) 
as.data.frame(ldat) 
      X02R X03N X04K X04N X04R X06I X06N X08J X08P X09O X11O X12L X14N X15G X16K 
1961-01-03 21.4 12.6 63.7 0 17.7 47.2 30 47.6 13.6 22.9 9 74.5 4.2 28.3 15.4 

它看起來好像sum參數(最終)獲取位置上匹配到apply.monthly「FUN」參數,但如果在lapply參數列表中將它們命名爲「FUN」,則會發生錯誤。

2

試試這個:

> library(zoo) 
> 
> # test data 
> z <- zooreg(cbind(a = 1:365, b = 1:365), Sys.Date()) 
> head(z) 
      a b 
2011-09-02 1 1 
2011-09-03 2 2 
2011-09-04 3 3 
2011-09-05 4 4 
2011-09-06 5 5 
2011-09-07 6 6 
> 
> aggregate(z, as.yearmon) 
      a  b 
Sep 2011 435 435 
Oct 2011 1395 1395 
Nov 2011 2265 2265 
Dec 2011 3286 3286 
Jan 2012 4247 4247 
Feb 2012 4843 4843 
Mar 2012 6107 6107 
Apr 2012 6825 6825 
May 2012 7998 7998 
Jun 2012 8655 8655 
Jul 2012 9889 9889 
Aug 2012 10850 10850