Как объединить ежедневные данные в ежемесячные и ежегодные в R


Иногда вам может понадобиться агрегировать ежедневные данные в еженедельные, ежемесячные или годовые данные в R.

В этом руководстве объясняется, как легко это сделать с помощью пакетов lubridate и dplyr .

Пример: совокупные ежедневные данные в R

Предположим, у нас есть следующий фрейм данных в R, который показывает ежедневные продажи некоторого товара в течение 100 дней подряд:

#make this example reproducible
set.seed(1)

#create data frame 
df <- data.frame(date = as.Date (" 2020-12-01 ") + 0:99,
 sales = runif (100, 20, 50))

#view first six rows
head(df)

 date sales
1 2020-12-01 27.96526
2 2020-12-02 31.16372
3 2020-12-03 37.18560
4 2020-12-04 47.24623
5 2020-12-05 26.05046
6 2020-12-06 46.95169

Чтобы агрегировать эти данные, мы можем использовать функцию floor_date() из пакета lubridate , которая использует следующий синтаксис:

floor_date (x, unit)

куда:

  • x: вектор объектов даты.
  • unit: единица времени для округления. Опции включают секунды, минуты, часы, день, неделю, месяц, два месяца, квартал, полугодие и год.

В следующих фрагментах кода показано, как использовать эту функцию вместе с функциями group_by() иsummary() из пакета dplyr , чтобы найти средние продажи по неделям, месяцам и годам:

Средние продажи по неделям

library (lubridate)
library(dplyr)

#round dates down to week
df$week <- floor_date (df$date, " week ")

#find mean sales by week
df %>%
 group_by(week) %>%
 summarize(mean = mean (sales))

# A tibble: 15 x 2
 week mean

 1 2020-11-29 33.9
 2 2020-12-06 35.3
 3 2020-12-13 39.0
 4 2020-12-20 34.4
 5 2020-12-27 33.6
 6 2021-01-03 35.9
 7 2021-01-10 37.8
 8 2021-01-17 36.8
 9 2021-01-24 32.8
10 2021-01-31 33.9
11 2021-02-07 34.1
12 2021-02-14 41.6
13 2021-02-21 31.8
14 2021-02-28 35.2
15 2021-03-07 37.1

Средние продажи по месяцам

library (lubridate)
library(dplyr)

#round dates down to week
df$month <- floor_date (df$date, " month ")

#find mean sales by month
df %>%
 group_by(month) %>%
 summarize(mean = mean (sales))

# A tibble: 4 x 2
 month mean

1 2020-12-01 35.3
2 2021-01-01 35.6
3 2021-02-01 35.2
4 2021-03-01 37.0

Средние продажи по годам

library (lubridate)
library(dplyr)

#round dates down to week
df$year <- floor_date (df$date, " year ")

#find mean sales by month
df %>%
 group_by(year) %>%
 summarize(mean = mean (sales))

# A tibble: 2 x 2
 year mean

1 2020-01-01 35.3
2 2021-01-01 35.7

Обратите внимание, что мы выбрали агрегирование по среднему значению, но мы могли использовать любую сводную статистику, такую как медиана, мода, максимум, минимум и т. д.

Дополнительные ресурсы

Как рассчитать среднее значение по группе в R
Как рассчитать кумулятивные суммы в R
Как построить временной ряд в R