2013-04-10 5 views
1

У меня есть данные, измеренные в течение 7 дней. Часть данных выглядит следующим образом:Агрегирование еженедельных (7 дней) данных до ежемесячно в R

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. Обратите внимание, что некоторые из 7-дневных данных X1 будут перекрываться с одного месяца на другой (X1 = 79 за период с 2/29 по 3/6 2004 года).

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

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

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

ответ

3

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

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 
+0

Да, идеально. Я пытался конвертировать данные в ежедневный и не мог сделать это эффективно. огромное спасибо –

0

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

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

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

Тогда вы всегда можете восстановить даты окончания, если вы абсолютно необходимы их путем добавления 30.