Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use `apply.monthly` in a zoo object with several columns

Tags:

r

zoo

I have a zoo object called pp with daily data and 77 columns that looks like this:

            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 
(...)  

I want to use apply.monthly to each of the columns, so in the end I will still have 77 columns but with monthly data instead of daily data. I tried apply.monthly(pp, FUN=sum) but the result is a zoo object with just one column (I think is adding all the columns).

I also tried a loop:

for (i in 1:77) { mensal<-apply.monthly(pp[,i], FUN=sum) } but it also results in just one column (the 77th column). I might be able to make the loop work with some trial and error but it takes ages to compute ( I have 17897 rows and 77 columns) and I guess there is a simpler way of doing this without using loops... So if you know how, please help. Thanks!

like image 488
sbg Avatar asked Sep 02 '11 16:09

sbg


2 Answers

In order for apply.monthly to return an object with more than one column, you have to use a function that operates by column (or apply a function that doesn't).

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)
like image 119
Joshua Ulrich Avatar answered Nov 15 '22 13:11

Joshua Ulrich


Try this:

> 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
like image 30
G. Grothendieck Avatar answered Nov 15 '22 14:11

G. Grothendieck