Как мы говорили ранее одним из типов переменных является дата и время. В R уже встроены основные функции для работы с датами. Это функции as.Date и as.POSIXct. Ими можно пользоваться, но они уже устарели. Поэтому был создан более функциональный пакет lubridate для работы с датами и временем.
Подгрузим пакет lubridate . Также нам понадобится уже знакомый нам пакет nycglights13 и пакет dplyr.
# install.packages('lubridate')
# install.packages('nycflights13')
# install.packages('dplyr')
library('lubridate')
library('nycflights13')
library('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 для даты и времени.
flights %>%
select(year, month, day, hour, minute) %>%
mutate(departure_dt = make_datetime(year, month, day, hour, minute),
departure_d = make_date(year, month, day))## # 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 – секундаdatetime <- ymd_hms("2016-07-08 12:34:56")
year(datetime)
## [1] 2016
month(datetime)
## [1] 7
mday(datetime)
## [1] 8
yday(datetime)
## [1] 190
wday(datetime)
## [1] 6
hour(datetime)
## [1] 12
minute(datetime)
## [1] 34
second(datetime)
## [1] 56Передав функциям 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 предназначен для работы со строками. Мы знакомы со строковым типом с самого первого занятия, но никаких операций с ним делать не можем. Если только функции 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 создан для работы с факторными переменными. Если вам вдруг придется работать с ними, то ищите информацию в этом пакете :)