【问题标题】:How to use `apply.monthly` in a zoo object with several columns如何在具有多列的动物园对象中使用`apply.monthly`
【发布时间】:2011-09-02 16:35:58
【问题描述】:

我有一个名为 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 列),我想有一种更简单的方法可以在不使用循环的情况下做到这一点......所以如果你知道怎么样,请帮忙。谢谢!

【问题讨论】:

    标签: r zoo


    【解决方案1】:

    为了让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 列。在我更新之前我得到了错误。它确实需要重新启动或 detach()-ing/(re-)require()-ing 更新后驻留的所有包。尝试在提供的结构上使用 FUN=sum。 (将在答案框中发布 dput() 输出。)
    • 您知道为什么您的 SPY 示例没有被折叠吗? sum() 日期或索引没有多大意义,但 last() 可能对有序索引有一个自然的解释?
    • @Dwin:我在最初的回答中使用了last,它返回一个 1xn 对象。 sum 只返回一个元素向量。
    • 谢谢。我有 NA 值,我确实 apply.monthly(data, colSums, na.rm = TRUE),它似乎有效。
    【解决方案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
    

    【讨论】:

      【解决方案3】:

      这只是一个可重现的例子。创建者:

      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)
      

      输入(数据) 结构(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), class= "日期"), 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”,则会出现错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-14
        相关资源
        最近更新 更多