Home > Software design >  Compute day of the month and monthly averages in R and add as column
Compute day of the month and monthly averages in R and add as column

Time:07-03

I have a data frame stored with daily data within a year and I want to compute monthly averages as well as day of the week averages and add those values as additional columns. Here is a MWE of my data frame

df <- tibble(Date = seq(as.Date('2020-01-01'), by = '1 day', length.out = 365),
         Daily_sales = rnorm(365, 2, 1))

df <- df %>% 
  mutate(month = lubridate::month(Date),  #Month
         dow = lubridate::wday(Date, week_start = 1), #Day of the week
         dom = lubridate::day(Date))  #Day of the month

My problem is as follows: I know how to compute the monthly averages, e.g.

df %>% group_by(month) %>% summarize(Monthly_avg = mean(Daily_sales))

but i don't know how to add this as an additional column where every value in January has the average, and every value in February has the avg from February. E.g. if the avg of January is 2.22, then the new column should contain 2.22 for all dates in January. The same problem for the day of the week average.

CodePudding user response:

Instead of summarize()ing an entire group into one row, we can mutate() all rows to add the group mean:

result <- df %>%
  group_by(month) %>% mutate(monthly_avg = mean(Daily_sales)) %>%
  group_by(dow) %>% mutate(dow_avg = mean(Daily_sales)) %>%
  group_by(dom) %>% mutate(dom_avg = mean(Daily_sales)) %>%
  ungroup()
  • Related