Объединение еженедельных (7-дневных) данных в ежемесячные в R

У меня есть данные, измеренные за 7-дневный период. Часть данных выглядит следующим образом:

start wk    end wk      X1
2/1/2004    2/7/2004    89
2/8/2004    2/14/2004   65
2/15/2004   2/21/2004   64
2/22/2004   2/28/2004   95
2/29/2004   3/6/2004    79
3/7/2004    3/13/2004   79

Я хочу преобразовать эти еженедельные (7-дневные) данные в ежемесячные данные, используя средневзвешенные значения X1. Обратите внимание, что некоторые из данных X1 за 7 дней будут перекрываться от одного месяца к другому (X1=79 за период с 29 февраля по 6 марта 2004 г.).

В частности, я бы получил ежемесячные данные за февраль 2004 г. (скажем, Y1) следующим образом.

(7*89 + 7*65 + 7*64 + 7*95 + 1*79)/29 = 78.27

Есть ли в R функция, которая правильно это сделает? (to.monthly в библиотеке xts НЕ делает то, что мне нужно) Если нет, то как лучше всего это сделать в R?


person Roberto Rivera    schedule 10.04.2013    source источник


Ответы (2)


Преобразуйте данные в ежедневные данные, а затем агрегируйте:

Lines <- "start end X1
2/1/2004    2/7/2004    89
2/8/2004    2/14/2004   65
2/15/2004   2/21/2004   64
2/22/2004   2/28/2004   95
2/29/2004   3/6/2004    79
3/7/2004    3/13/2004   79
"

library(zoo)

# read data into data frame DF
DF <- read.table(text = Lines, header = TRUE)

# convert date columns to "Date" class
fmt <- "%m/%d/%Y"
DF <- transform(DF, start = as.Date(start, fmt), end = as.Date(end, fmt))

# convert to daily zoo series
to.day <- function(i) with(DF, zoo(X1[i], seq(start[i], end[i], "day")))
z.day <- do.call(c, lapply(1:nrow(DF), to.day))

# aggregate by month
aggregate(z.day, as.yearmon, mean)

Последняя строка дает:

Feb 2004 Mar 2004 
78.27586 79.00000 
person G. Grothendieck    schedule 10.04.2013
comment
Да, идеально. Я пытался преобразовать данные в ежедневные и не мог сделать это эффективно. Большое спасибо - person Roberto Rivera; 11.04.2013

Если вы хотите избавиться от «конец недели» из своего DF, apply.monthly будет работать как шарм.

DF.xts <- xts(DF$X1, order.by=DF$start_wk)

DF.xts.monthly <- apply.monthly(DF.xts, "sum")

Затем вы всегда можете воссоздать конечные даты, если они вам абсолютно необходимы, добавив 30.

person maverik    schedule 30.10.2014