Как мы говорили ранее одним из типов переменных является дата и время. В 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
создан для работы с факторными переменными. Если вам вдруг придется работать с ними, то ищите информацию в этом пакете :)