Среднее значение данных за месяц (jan-de c) в объектах xts - PullRequest
2 голосов
/ 20 июня 2020

У меня есть этот большой xts , агрегированный ежемесячно с функцией apply.monthly .

2011-07-31 269.8
2011-08-31 251.0
2011-09-30 201.8
2011-10-31 95.8
2011-11-30 NA
2011-12-31 49.3
2012-01-31 77.1
...

Я хочу вычислить среднее значение Jan-De c месяцев за весь период. Примерно так, но в форме xts :

01 541.8
02 23.0
03 34.8
04 12.8
05 21.8
06 44.8
07 22.8
08 55.0
09 287.8
10 15.8
11 113
12 419.3

Я хочу избежать использования функций dplyr , таких как group_by . Я думаю, что должно быть решение, использующее split и lapply / do.call

Я пробовал разбивать xts по годам

xtsobject <- split(xtsobject, f = "years")

, а затем я не знаю, как правильно использовать функцию lapply , чтобы вычислить 12 средних значений (январь-декабрь c) за весь период. Этот вопрос Group by period.apply () в xts аналогичен, но в моем xts у меня нет / не нужен новый столбец, я думаю, что это можно сделать с помощью индекса xts.

Ответы [ 3 ]

2 голосов
/ 20 июня 2020

Кажется, индекс - это число, а не объект POSIXct. Вы можете преобразовать его и использовать format для извлечения месяцев и использовать его в tapply:

tapply(xtsobject[, 1], format(as.POSIXct(zoo::index(xtsobject), 
                          origin = '1970-01-01'), '%m'), mean, na.rm = TRUE)
2 голосов
/ 20 июня 2020

Предполагая, что входные данные x воспроизводимо показаны в примечании в конце, используйте aggregate.zoo следующим образом:

ag <- aggregate(x, cycle(as.yearmon(time(x))), mean, na.rm = TRUE)
ag

, получив следующую серию зоопарка:

1   77.1
7  269.8
8  251.0
9  201.8
10  95.8
11   NaN
12  49.3

Мы могли бы построить это так:

plot(ag, type = "h")

Скриншот

Примечание

Lines <- "2011-07-31 269.8
2011-08-31 251.0
2011-09-30 201.8
2011-10-31 95.8
2011-11-30 NA
2011-12-31 49.3
2012-01-31 77.1"

library(xts)
z <- read.zoo(text = Lines)
x <- as.xts(z)
2 голосов
/ 20 июня 2020

Вы можете использовать функцию base::months для извлечения месяца перед вычислением среднего:

do.call(rbind, lapply(split(x, base::months(index(x))), mean, na.rm=TRUE))

вывод:

              [,1]
April     165.1600
August    290.2444
December  106.8200
February   82.6300
January    62.9100
July      264.9889
June      246.4889
March     100.5500
May       246.3333
November  116.6400
October   151.3667
September 158.5667
...