我有一个名为pp的动物园对象,每日数据和77列,如下所示:
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列),我想有一种更简单的方法可以不使用循环...所以如果你知道怎么样,请帮忙。谢谢!
答案 0 :(得分:10)
为了让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 :(得分: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
答案 2 :(得分: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” )),index = structure(c(-3287,-3286,-3285),class =“Date”),class =“zoo”)
但是现在我有办法重新创建错误,也许我可以提供经过测试的解决方案:
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”,则会出现错误列表。