dplyr, lubridate : how to aggregate a dataframe by week?

后端 未结 4 944
时光取名叫无心
时光取名叫无心 2020-11-29 03:54

Consider the following example

library(tidyverse)
library(lubridate)
time <- seq(from =ymd(\"2014-02-24\"),to= ymd(\"2014-03-20\"), by=\"days\")
set.seed(         


        
4条回答
  •  遥遥无期
    2020-11-29 04:02

    In the tidyverse,

    df2 %>% group_by(week = week(time)) %>% summarise(value = mean(values))
    
    ## # A tibble: 5 × 2
    ##    week    value
    ##       
    ## 1     8 37.50000
    ## 2     9 38.57143
    ## 3    10 38.57143
    ## 4    11 36.42857
    ## 5    12 45.00000
    

    Or use isoweek instead:

    df2 %>% group_by(week = isoweek(time)) %>% summarise(value = mean(values))
    
    ## # A tibble: 4 × 2
    ##    week    value
    ##       
    ## 1     9 37.14286
    ## 2    10 40.71429
    ## 3    11 35.00000
    ## 4    12 42.50000
    

    Or cut.Date:

    df2 %>% group_by(week = cut(time, "week")) %>% summarise(value = mean(values))
    
    ## # A tibble: 4 × 2
    ##         week    value
    ##           
    ## 1 2014-02-24 37.14286
    ## 2 2014-03-03 40.71429
    ## 3 2014-03-10 35.00000
    ## 4 2014-03-17 42.50000
    

    which you can tell to start on Sunday, if you prefer:

    df2 %>% group_by(week = cut(time, "week", start.on.monday = FALSE)) %>% 
        summarise(value = mean(values))
    
    ## # A tibble: 4 × 2
    ##         week    value
    ##           
    ## 1 2014-02-23 37.50000
    ## 2 2014-03-02 40.00000
    ## 3 2014-03-09 33.57143
    ## 4 2014-03-16 44.00000
    

    If you want to shift to, say, Tuesday start, add one to your dates:

    df2 %>% group_by(week = cut(time + 1, "week")) %>% summarise(value = mean(values))
    
    ## # A tibble: 4 × 2
    ##         week    value
    ##           
    ## 1 2014-02-24 37.50000
    ## 2 2014-03-03 40.00000
    ## 3 2014-03-10 33.57143
    ## 4 2014-03-17 44.00000
    

    Labels will be off, though. If using cut, consider the implications of its include.lowest and right parameters, documented at ?cut.

提交回复
热议问题