Как использовать `apply.monthly` в объекте зоопарка с несколькими столбцами - PullRequest
7 голосов
/ 02 сентября 2011

У меня есть объект зоопарка 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 столбцов), и я думаю, что есть более простой способ сделать это без использования циклов ... Так что, если вы знаете,как, пожалуйста, помогите.Спасибо!

Ответы [ 3 ]

10 голосов
/ 02 сентября 2011

Чтобы 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)
3 голосов
/ 02 сентября 2011

Попробуйте это:

> 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
0 голосов
/ 02 сентября 2011

Это только для воспроизводимого примера.Создано с:

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), 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", но вы получите ошибку, если дадите им обоим имя«FUN» в списке довольных аргументов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...