Пакет lubridate

Как мы говорили ранее одним из типов переменных является дата и время. В R уже встроены основные функции для работы с датами. Это функции as.Date и as.POSIXct. Ими можно пользоваться, но они уже устарели. Поэтому был создан более функциональный пакет lubridate для работы с датами и временем.

Подгрузим пакет lubridate . Также нам понадобится уже знакомый нам пакет nycglights13 и пакет dplyr.

Создание переменных

Существует три типа данных, описывающих время:

  • дата(date) – календарная дата
  • время(time) – время суток
  • дата и время(dttm/POSIXct) – календарная дата + время суток

Мы будем говорить только о первом и третьем типе.

С помощью функций today и now вы можете получить значения текущей даты или даты и времени.

## [1] "2019-10-31"
## [1] "2019-10-31 00:07:36 MSK"

Создать переменную даты и времени можно с помощью следующих способов:

  • на основе строковой переменной
  • на основе индвидуальных компонент даты и времени
  • на основе существующего объекта даты и времени

Рассмотрим каждый из них.

Создание переменных на основе строк

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

## [1] "2017-01-31"
## [1] "2017-01-31"
## [1] "2017-01-31"

На вход этим функциям можно подать и числовое значение.

## [1] "2017-01-31"

Чтобы создать переменную даты и времени нужно добавить в имя функции символ нижнего подчеркивания и одну или несколько дополнительных букв h, m и s, которым соответствуют часы, минуты и секунды.

Создание переменных на основе отдельных компонент

Иногда вы будете располагать отдельными компонентами даты и времени, предоставленных в нескольких столбцах. Например такой вариант есть в фрейме данных flights.

## # A tibble: 336,776 x 5
##     year month   day  hour minute
##    <int> <int> <int> <dbl>  <dbl>
##  1  2013     1     1     5     15
##  2  2013     1     1     5     29
##  3  2013     1     1     5     40
##  4  2013     1     1     5     45
##  5  2013     1     1     6      0
##  6  2013     1     1     5     58
##  7  2013     1     1     6      0
##  8  2013     1     1     6      0
##  9  2013     1     1     6      0
## 10  2013     1     1     6      0
## # … with 336,766 more rows

В таком случае можно использовать функцию make_date для даты и make_datetime для даты и времени.

## # A tibble: 336,776 x 7
##     year month   day  hour minute departure_dt        departure_d
##    <int> <int> <int> <dbl>  <dbl> <dttm>              <date>     
##  1  2013     1     1     5     15 2013-01-01 05:15:00 2013-01-01 
##  2  2013     1     1     5     29 2013-01-01 05:29:00 2013-01-01 
##  3  2013     1     1     5     40 2013-01-01 05:40:00 2013-01-01 
##  4  2013     1     1     5     45 2013-01-01 05:45:00 2013-01-01 
##  5  2013     1     1     6      0 2013-01-01 06:00:00 2013-01-01 
##  6  2013     1     1     5     58 2013-01-01 05:58:00 2013-01-01 
##  7  2013     1     1     6      0 2013-01-01 06:00:00 2013-01-01 
##  8  2013     1     1     6      0 2013-01-01 06:00:00 2013-01-01 
##  9  2013     1     1     6      0 2013-01-01 06:00:00 2013-01-01 
## 10  2013     1     1     6      0 2013-01-01 06:00:00 2013-01-01 
## # … with 336,766 more rows

Создание переменных на основе других типов

Иногда возникает необходимость перехода между значениями даты и даты/времени. Для этого можно использовать функции as_datetime и ad_date.

## [1] "2019-10-31 UTC"
## [1] "2019-10-31"

Иногда ваши исходные значения даты и времени могут быть заданы в виде количество секунд, которое прошло с 1 января 1970 года. В этом случае тоже можно использовать эти функции.

## [1] "1970-01-01 10:00:00 UTC"
## [1] "1980-01-01"

Компоненты даты и времени

Из переменных даты и времени можно выделять следующие компоненты:

  • year – год
  • month – месяц
  • mday – день месяца
  • yday – день года
  • wday – день недели
  • hour – час
  • minute – минута
  • second – секунда

Передав функциям month и wday аргумент label = TRUE, можно получить сокращенное название месяца или дня недели. Чтобы получить полное название можно задать аргумент abbr = TRUE.

## [1] июл
## 12 Levels: янв < фев < мар < апр < май < июн < июл < авг < сен < ... < дек
## [1] пятница
## 7 Levels: воскресенье < понедельник < вторник < среда < ... < суббота

Компоненты можно так же менять.

Все изменения можно произвести за один раз с помощью функции update.

## [1] "2020-02-02 02:34:56 UTC"

Если значения слишком большие, они переносятся на следующие года, месяцы и так далее.

## [1] "2015-03-02"
## [1] "2015-02-17 16:00:00 UTC"

Временные промежутки

Над датами можно выполнять арифметические операции.

В R при вычитании двух дат вы получаете объект difftime.

## Time difference of 7849 days

Этот объект выводит промежутки, выраженные в секундах, минутах, часах, днях или неделях. Эта неоднозначность может несколько затруднять работу с объектами difftime. Поэтому лучше использовать функцию as.duration, которая приводит все в секунды, из которых вы можете получить то, что вам нужно.

## [1] "678153600s (~21.49 years)"

Чтобы получить число без надписей, можно использовать функцию as.numeric.

## [1] 678153600

Пакет stringr

Пакет stringr предназначен для работы со строками. Мы знакомы со строковым типом с самого первого занятия, но никаких операций с ним делать не можем. Если только функции paste и paste0.

Помним, что для создания строки нужно использовать кавычки.

Все функции в пакете stringr начинаются с str_. Это очень удобно, вы можете написать str_, потом нажать Tab и вам будут показаны функции из пакета stingr.

Длина строки

Функция str_length показывает длину строки. Может работать как с одной строкой, так и с массивом строк.

## [1] 5
## [1]  5  5  1 NA

Объединение строк

Функция str_c обьединяет две или большее число строк.

## [1] "xy"

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

## [1] "x-y"

Если вы испольуете массив на входе, то следует использовать аргумент collapse для склеивания.

## [1] "x, y, z"

Также можно использовать “зацикливание”.

## [1] "prefix-x-suffix" "prefix-y-suffix" "prefix-z-suffix"

Извлечение подстрок

Чтобы извлечь подстроку можно использовать функцию str_sub, которая имеет аргументы start и end, которые задают начало и конец подстроки.

## [1] "ell"

Можно использовать в качестве аргумента не строку, а массив.

## [1] "ell" "orl"

Регистр

Следующие функци позволяют менять регистр букв:

  • str_to_lower – нижний регистр
  • str_to_upper – верхний регистр
  • str_to_title – каждое слово начинается с большой буквы

Удаление пробелов

Функция str_trim удаляет пробелы слева и справа.

## [1] "Hello world!"

Регулярные выражения

Регулярные выражения – это язык, позволяющий описывать строковые шаблоны. Их вид ужасает, но они очень удобны! С помощью них вы можете находить в строке то, что вам нужно.

Используем функцию str_view для демонстрации. На вход она принимает символьный ветор и регулярное выражение.

Начнем с простого. Найдем выражение, которое содержится в слове (неважно где).

Добавим точку (.) Вместо неё может быть любой символ, кроме символа перевода строки(\n).

Но если точке соотвествует любой символ, то какому шаблону будет соотвествовать сам символ точки (.). В регулярных выражениях для этого используется обратный слеш (\). То есть нужно использовать \.. Но для создания регулярного выражения нужно использовать опять обратный слеш.

Так называемые якоря:

  • ^ to match the start of the string.
  • $ to match the end of the string.

Используем оба “якоря”, чтобы выделить выражения, которые содержат только нужное нам слово.

Мы уже использовали символ точки (.). Изучим другие символы:

  • \d – совпадает с любой цифрой
  • \s – совпадает с любым пробельным символом(пробел, символ табуляции(\t), перевод строки(\n))
  • [abc] – совпадает с a, b или c
  • [^abc] – совпадает с любым сиволом, кроме a,b или c

Также можно использовать логический оператор ИЛИ (|) для выбора одного из значений. Лучше такие выражения писать в круглых скобках.

Остановимся на этом! Регулярных выражений очень много и с ними достаточно тяжело иметь дело в самом начале.

Функции для использования регулярных выражений

Функция str_detect дает логический ответ на вопрос, есть ли шаблон, который соотвествует регулярному выражению в строке.

## [1]  TRUE FALSE  TRUE

В пакете stringr есть массив, состоящий из 1000 английских слов. Он называется words. Потренируемся на нем. Найдем количество слов, которые начинаются с t.

## [1] 65

Или найдем долю слов, которые заканчиваются на гласную.

## [1] 0.2765306

Функция str_replace может заменить совпадения новыми строками.

## [1] "apple"  "banana" "pear"
## [1] "-pple"  "b-nana" "p-ar"

Эта функция заменяет только первое совпадение. Все совпадения можно заменить с помощью функции str_replace_all.

## [1] "-ppl-"  "b-n-n-" "p--r"

Пакет forcats

Пакет forcats создан для работы с факторными переменными. Если вам вдруг придется работать с ними, то ищите информацию в этом пакете :)