#r #database #time-series
Вопрос:
У меня есть следующий набор данных:
id observation_date Observation_value
1 2015-02-23 5
1 2015-02-24 6
1 2015-03-01 24
1 2015-07-16 2
1 2015-09-28 9
1 2015-12-05 12
Я хотел бы создать среднемесячные значения наблюдения_значения. В тех случаях, когда нет значений для определенного месяца, я хотел бы заполнить данные средним значением за те месяцы, в течение которых у меня есть данные.
Комментарии:
1. Пожалуйста, покажите, что вы пробовали и где потерпели неудачу.
Ответ №1:
Используя данные в примечании в конце-мы добавили второй идентификатор-преобразуйте в zoo, используя столбец 1 для разделения на и столбец 2 в качестве индекса с классом yearmon. Также в том же операторе агрегируйте, используя среднее значение за год/месяц, давая объекту z зоопарка. Затем преобразуйте в ts, который заполнит недостающие месяцы NA, а затем преобразуйте обратно в zoo и используйте na.approx для заполнения NAs (или используйте na.spline или na.locf в зависимости от того, что вы хотите). fortify.zoo(zz) и fortify.zoo(zz, значение = TRUE) можно использовать для преобразования объектов zoo в фреймы данных.
library(zoo)
z <- read.zoo(dat, FUN = as.yearmon, index = 2, split = 1, aggregate = mean)
zz <- na.approx(as.zoo(as.ts(z)))
дающий
> zz
1 2
Feb 2015 5.5 5.5
Mar 2015 24.0 24.0
Apr 2015 18.5 18.5
May 2015 13.0 13.0
Jun 2015 7.5 7.5
Jul 2015 2.0 2.0
Aug 2015 5.5 5.5
Sep 2015 9.0 9.0
Oct 2015 10.0 10.0
Nov 2015 11.0 11.0
Dec 2015 12.0 12.0
Примечание
Lines <- "id observation_date Observation_value
1 2015-02-23 5
1 2015-02-24 6
1 2015-03-01 24
1 2015-07-16 2
1 2015-09-28 9
1 2015-12-05 12
2 2015-02-23 5
2 2015-02-24 6
2 2015-03-01 24
2 2015-07-16 2
2 2015-09-28 9
2 2015-12-05 12"
dat <- read.table(text = Lines, header = TRUE)