Заметки по R: находим каждый последний понедельник месяца в наборе данных

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Периодически возникают задачи в R, которые просты по своей сути, но не очевидны для тех, кто только начинает свой путь.

Представим, что в нашей организации каждый последний понедельник месяца происходит учет товара. В эти дни нет продаж. И мы бы хотели учесть это в наших прогнозах. Стоит вопрос: как в данных "выловить" эти понедельники, не используя function.

Посмотрим как это можно сделать

Для начала нам нужно импортировать библиотеки tidyverse и lubridate.

Tidyverse - это набор пакетов для языка программирования R, разработанных командой Hadley Wickham и его коллегами. Он содержит несколько пакетов, которые упрощают чтение, обработку, визуализацию и моделирование данных, используя единый фреймворк и стиль программирования. Ключевыми пакетами в Tidyverse являются ggplot2 для визуализации данных, dplyr для манипуляции с данными, tidyr для работы с данными в "длинном" формате, readr для чтения и записи данных в формате CSV и других форматах, а также purrr для функционального программирования. Tidyverse стремится к тому, чтобы программы на R были более понятными, лаконичными и легко читаемыми благодаря единому подходу к обработке и визуализации данных.

Lubridate - это пакет для языка программирования R, который облегчает работу с датами и временем. Он предоставляет удобный интерфейс для различных задач, таких как извлечение даты, времени и интервалов времени из строк, форматирование дат и времени, арифметические операции с датами и временем, конвертация между различными форматами дат и времени, и многое другое.

# импортируем библиотеки tidyverse и lubridate
library(tidyverse)
library(lubridate)

# создадим набор данных с 2023-01-01 по 2024-12-31
df <- seq(ymd("2023-01-01"), ymd("2024-12-31"), by = "day")
df <- as_tibble(df)

Создадим дополнительные столбцы: w_day (день недели), m_th (месяц) и y_r (год):

df_wmy <- df %>% 
  mutate(
    w_day = wday(value, week_start = 1),
    m_th = month(value),
    y_r = year(value)
  )

Аргумент week_start в функции wday() используется для указания дня недели, который будет считаться началом недели при вычислении дня недели для заданной даты. По умолчанию, week_start равен 7, что означает, что неделя начинается с воскресенья и заканчивается в субботу.

Если установить week_start = 1, то неделя будет начинаться с понедельника, а заканчиваться в воскресенье. Другими словами, если установить week_start = 1 и вызвать функцию wday() для даты, которая выпадает на понедельник, то функция вернет значение 1, а для даты, которая выпадает на воскресенье, функция вернет значение 7.

Например, вызов wday("2023-02-13", week_start = 1) вернет значение 1, так как 13 февраля 2023 года - это понедельник. А вызов wday("2023-02-19", week_start = 1) вернет значение 7, так как 19 февраля 2023 года - это воскресенье.

Функции month и yearпозволяют извлекать информацию в формате целого числа.

Теперь, имея дополнительные столбы, мы можем выбрать нужные нам понедельники:

df_monday <- df_w_m %>%
  filter(w_day == 1) %>% 
  group_by(m_th, y_r) %>% 
  filter(row_number() == n()) %>%
  ungroup()

Здесь мы применили фильтр, чтобы работать только в рамках того дня недели, который нас интересует. Затем группируем данные по месяцу и году, чтобы, применив выражение filter(row_number() == n()), найти последнее значение в сгруппированном фрейме данных.

Конструкция row_number() == n() является логическим выражением, используемым для фильтрации данных в R с помощью библиотеки dplyr.

Функция row_number() создает новый столбец с номерами строк в наборе данных, а n() является функцией-аргументом внутри filter(), которая возвращает номер строки, на которой находится текущая итерация фильтрации.

Таким образом, row_number() == n() сравнивает номера строк с текущим номером итерации, возвращенным n(), и возвращает TRUE, если номер строки соответствует номеру текущей итерации фильтрации.

Использование этого выражения в filter() позволяет выбрать только одну строку из набора данных, которая соответствует текущей итерации фильтрации.

В нашем случае мы выбираем каждое последнее значение в каждой группе. Если бы мы хотели, например, найти каждый второй понедельник месяца - мы бы изменили наше выражение на

df_w_m %>%
  filter(w_day == 1) %>% 
  group_by(m_th, y_r) %>% 
  filter(row_number() == 2) %>%
  ungroup()

Источник: https://habr.com/ru/post/716672/


Интересные статьи

Интересные статьи

Функционал раций покрывает все нужды в своей нише, но, учитывая, что мобильный телефон всегда под рукой, хотелось бы попробовать сочетать утилитарность раций и удобство смартфона. Даже возможность пер...
Обеспечение конфиденциальности и безопасности данных участников до, во время и после сбора данных критично важно для процесса исследования пользователей. Это защищает участников от утечек данных и киб...
Всем Привет, мне 22. я чуть больше полу года назад, понял, что хочу делать игры. Начал изучать C#, 3 месяца учил основы из книжки Шилдта, половину осилил с конспектами, потом решил, что учиться лучше ...
Данная статья - это не научный прорыв, а лишь помощник быстрее понять как работает стандартный функционал в BitrixДавайте представим, что в разделе каталога у нас 150 запросов к БД. Вроде бы немного п...
Многие, наверное, уже видели фильм «Рыцари справедливости», где дата-сайнтисты на основе набора фактов о теракте чуть не раскрыли преступление, но совершили ошибку, вероя...