将每日数据汇总到每周定制4周的月份

时间:2017-03-25 09:35:39

标签: r aggregate

我想在y上运行x的MIDAS回归。 x是每周数据,y是每月。为了做到这一点,周数应该可以被几个月整除,反之亦然,周数应该是几个月的倍数。

问题是几个月的周数(4-5)不同,所以上述情况不成立。因此,我想转换数据,以便每个月包含4周。

我首先想到将每周数据(从星期六开始)分解为每日数据,然后定义自定义周数,即

第1周:1-8天, 第二周:9-15, 第3周:16-23, 第4周:24-30或31

我设法将每周数据分解成每日,但我很难在周月形式中将它们汇总回来。通过汇总我的意思是取平均值。

#Original Data
        Date Hits wday
1 2012-03-24   81    7
2 2012-03-31   77    7
3 2012-04-07   80    7
4 2012-04-14   83    7
5 2012-04-21   83    7
6 2012-04-28   83    7

#Daily data
        ddate hhits wday mday month week
1  2012-03-24    81    7   24     3   12
2  2012-03-25    77    1   25     3   13
3  2012-03-26    77    2   26     3   13
4  2012-03-27    77    3   27     3   13
5  2012-03-28    77    4   28     3   13
6  2012-03-29    77    5   29     3   13
7  2012-03-30    77    6   30     3   13
8  2012-03-31    77    7   31     3   13
9  2012-04-01    80    1    1     4   14
10 2012-04-02    80    2    2     4   14
11 2012-04-03    80    3    3     4   14
12 2012-04-04    80    4    4     4   14
13 2012-04-05    80    5    5     4   14
14 2012-04-06    80    6    6     4   14
15 2012-04-07    80    7    7     4   14
16 2012-04-08    83    1    8     4   15
17 2012-04-09    83    2    9     4   15
18 2012-04-10    83    3   10     4   15
19 2012-04-11    83    4   11     4   15
20 2012-04-12    83    5   12     4   15
21 2012-04-13    83    6   13     4   15
22 2012-04-14    83    7   14     4   15
23 2012-04-15    83    1   15     4   16
24 2012-04-16    83    2   16     4   16
25 2012-04-17    83    3   17     4   16

#4week month 
     Date Hits
2012-03-4 77.5
2012-04-1   80
2012-04-2   83
...

其中值是前面定义的平均天数,2012-03-4代表3月的最后一个自定义周。

2 个答案:

答案 0 :(得分:0)

如果您没有丢失值,您几乎可以忽略日期列并执行:

d = data.frame(val=rnorm(100))

crude_filler = function(i){
   x = rep(1:(nrow(d)/i), each=i)
   c(x, rep(max(x) + 1, each=nrow(d) - length(x)))
}

d$week = crude_filler(7)
d$month = crude_filler(28)

如果您缺少值,请先创建一个新的(完整)数据框:

x = data.frame(Date=seq.Date(min(x), max(x), by=1))

x = merge(x, your_data)

如果你急于在每周的某一天开始,你需要调整。您还可以考虑使用移动平均线(例如https://stackoverflow.com/a/4862334/2773500)。

答案 1 :(得分:0)

以下是一个使用dplyr并创建分组变量的解决方案。

library(dplyr)

#create the function for grouping. 
get_groups <- function(x){
  l1 <- length(x) %/% 7
  grp <- c(rep(seq(l1), each = 7), rep(tail(seq(l1), 1), length(x) - 7 * l1))
    return(grp)
  }

#apply it using dplyr,
#First make sure your ddate is as.Date(df$ddate),

df %>% 
  group_by(v1 = format(ddate, '%Y-%m')) %>% 
  mutate(grp = get_groups(hhits)) %>% 
  group_by(v1, grp) %>% 
  summarise(avg = mean(hhits)) %>% 
  ungroup()

# A tibble: 3 × 3
#       v1   grp   avg
#    <chr> <int> <dbl>
#1 2012-03     1  77.5
#2 2012-04     1  80.0
#3 2012-04     2  83.0