2011-09-02 40 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