7

次のような毎日のデータと 77 列を含む pp という動物園オブジェクトがあります。

            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)ましたが、結果は1列だけのzooオブジェクトです(すべての列を追加していると思います)。

私もループを試しました:

for (i in 1:77) { mensal<-apply.monthly(pp[,i], FUN=sum) } ただし、結果は 1 列 (77 列目) になります。試行錯誤でループを機能させることができるかもしれませんが、計算には時間がかかります(17897行と77列があります)。ループを使用せずにこれを行う簡単な方法があると思います...どのように、助けてください。ありがとう!

4

3 に答える 3

12

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)
于 2011-09-02T16:41:39.320 に答える
3

これを試して:

> 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
于 2011-09-02T18:29:33.633 に答える
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.2、6、0.2、9.2)、. Dim = c(3L, 15L), .Dimnames = list( NULL, c("X02R", "X03N", "X04K", "X04N", "X04R", "X06I", "X06N", "X08J", "X08P"、"X09O"、"X11O"、"X12L"、"X14N"、"X15G"、"X16K" ))、インデックス = 構造体 (c(-3287、-3286、-3285)、クラス = "日付")、クラス = "動物園")

しかし、エラーを再現する方法ができたので、テスト済みのソリューションを提供できるかもしれません。

 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引数は (最終的に) "FUN" 引数と位置的に一致するように見えapply.monthlyますが、lapply 引数リストで両方に "FUN" という名前を付けるとエラーが発生します。

于 2011-09-02T17:56:00.563 に答える