R ичинде даталар менен иштөө (негизги мүмкүнчүлүктөр, ошондой эле майлоочу жана убакыттын R пакеттери)

Учурдагы датаны каалаган программалоо тилинде алыңыз, операция "Hello world!" R тили да өзгөчө эмес.

Бул макалада биз даталар менен иштөө R тилинин негизги синтаксисинде кантип иштээрин, ошондой эле даталар менен иштөөдө анын мүмкүнчүлүктөрүн кеңейтүүчү бир нече пайдалуу пакеттерди карап чыгабыз:

  • lubridate — даталардын ортосунда арифметикалык эсептөөлөрдү жүргүзүүгө мүмкүндүк берүүчү пакет;
  • timeperiodsR — убакыт интервалдары жана алардын компоненттери менен иштөө үчүн пакет.

R ичинде даталар менен иштөө (негизги мүмкүнчүлүктөр, ошондой эле майлоочу жана убакыттын R пакеттери)

ыраазы

Эгер сиз маалыматтарды талдоо, атап айтканда, R тилине кызыгып жатсаңыз, сизди менин телеграмма и YouTube каналдар. Мазмундун көбү R тилине арналган.

  1. Негизги R синтаксисинде даталар менен иштөө
    1.1. Текстти күнгө айландырыңыз
    1.2. Негизги R ичинде дата компоненттерин чыгаруу
  2. lubridate пакетин колдонуу менен даталар менен иштөө
    2.1. lubridate колдонуп бүгүнкү күнгө чейин текстти айландыруу
    2.2. lubridate пакетин колдонуу менен датасы компоненттерин казып алуу
    2.3. Даталар менен арифметикалык амалдар
  3. Мөөнөттөр менен жөнөкөйлөштүрүлгөн иш, timeperiodsR пакети
    3.1. Убакыт аралыктары R
    3.2. timeperiodsR аркылуу даталардын векторун чыпкалоо
  4. жыйынтыктоо

Негизги R синтаксисинде даталар менен иштөө

Текстти күнгө айландырыңыз

Basic R даталар менен иштөө үчүн функциялардын жыйындысына ээ. Негизги синтаксистин кемчилиги – функциялардын аталыштарынын жана аргументтеринин абалы өтө чачыранды жана иш жүзүндө эч кандай логикалык байланышы жок. Бирок, сиз тилдин негизги функцияларын билишиңиз керек, ошондуктан биз алардан баштайбыз.

Көбүнчө csv файлдарынан же башка булактардан R форматына маалыматтарды жүктөөдө сиз датаны текст катары аласыз. Бул текстти туура маалымат түрүнө айландыруу үчүн функцияны колдонуңуз as.Date().

# создаём текстовый вектор с датами
my_dates <- c("2019-09-01", "2019-09-10", "2019-09-23")

# проверяем тип данных
class(my_dates)

#> [1] "character"

# преобразуем текст в дату
my_dates <- as.Date(my_dates)

# проверяем тип данных
class(my_dates)

#> [1] "Date"

демейки боюнча as.Date() эки форматта датаны кабыл алат: ЖЖЖЖ-АА-КК же ЖЖЖЖ/АА/КК.
Эгер маалымат топтомуңуз башка форматтагы даталарды камтыса, аргументти колдонсоңуз болот format.

as.Date("September 26, 2019", format = "%B %d, %Y")

формат каалаган убакыт аралыгын жана анын форматын билдирген сап түрүндөгү операторлорду кабыл алат; эң көп колдонулган баалуулуктар төмөнкү таблицада көрсөтүлгөн:

формат
баяндоо

%d
Айдагы күн саны

%a
Аптанын күнүнүн аталышынын аббревиатурасы

%A
Аптанын күнүнүн толук аталышы

%w
Аптанын күнүнүн саны (0-6, мында 0 жекшемби)

%m
Эки орундуу ай белгилөө (01-12)

%b
Айдын аталышынын аббревиатурасы (апр, март,…)

%B
Айдын толук аты

%y
Жылдын эки орундуу белгиси

%Y
Жылдын төрт орундуу белгиси

%j
Жылдын күн саны (001 - 366)

%U
Жылдагы аптанын саны (00 - 53), жуманын башталышы жекшемби

%W
Жылдагы жуманын саны (00 - 53), жуманын башы дүйшөмбү

Демек, "26-жылдын 2019-сентябры" ай, дата жана жылдын толук аталышы. Бул дата форматын операторлор аркылуу төмөнкүчө сүрөттөсө болот:"%B %d, %Y".

мында:

  • %B — Айдын толук аты
  • %d — Айдагы күндүн саны
  • %Y — Жылдын төрт орундуу белгиси

Дата форматын сүрөттөп жатканда сапыңыздагы бардык кошумча белгилерди камтуу маанилүү, мисалы, сызыкчалар, үтүрлөр, чекиттер, боштуктар жана башкалар. Менин мисалымда, "26-жылдын 2019-сентябры", күндөн кийин үтүр бар, ошондой эле форматтын сүрөттөмөсүнө үтүр коюу керек:"%B %d, %Y".

Сиз стандарттуу форматтарга гана туура келбеген датаны алган жагдайлар бар (ЖЖЖЖ-АА-КК же ЖЖЖЖ/АА/КК), бирок ошондой эле операциялык тутумуңузда орнотулган демейки тилден айырмаланган тилде. Мисалы, сиз датасы төмөнкүдөй көрсөтүлгөн маалыматтарды жүктөп алдыңыз: "15-декабрь, 2019-жыл." Бул сапты датага айландыруудан мурун, тилди өзгөртүшүңүз керек.

# Меняем локаль
Sys.setlocale("LC_TIME", "Russian")
# Конвертируем строку в дату
as.Date("Декабрь 15, 2019 г.", format = "%B %d, %Y")

Негизги R ичинде дата компоненттерин чыгаруу

Негизги Rде класстын объектинен датанын каалаган бөлүгүн чыгарууга мүмкүндүк берген функциялар көп эмес дата.

current_date <- Sys.Date() # текущая дата
weekdays(current_date)     # получить номер дня недели
months(current_date)       # получить номер месяца в году
quarters(current_date)     # получить номер квартала в году

Негизги объект классынан тышкары дата негизги R ичинде убакыт белгисин сактаган дагы 2 маалымат түрү бар: POSIXlt, POSIXct. Бул класстардын негизги айырмасы жана дата Алар убакытты сактаган датага кошумча болуп саналат.

# получить текущую дату и время
current_time <- Sys.time()

# узнать класс объекта current_time 
class(current_time)

# "POSIXct" "POSIXt"

милдети Sys.time() форматта учурдагы дата менен убакытты кайтарат POSIXct. Бул формат мааниси жагынан окшош UNIXTIME, жана UNIX доорунун башталышынан берки секунданын санын сактайт (31-жылдын 1969-декабрынан 1-жылдын 1970-январына чейин түн жарымы (UTC)).

тап POSIXlt ал ошондой эле убакытты жана датаны жана алардын бардык компоненттерин сактайт. Ошондуктан, бул бир кыйла татаал түзүлүшү менен объект болуп саналат, бирок, анткени ал каалаган датасы жана убакыт компонентин алуу үчүн жеңил болот мааниси боюнча POSIXlt ал тизме.

# Получаем текущую дату и время
current_time_ct <- Sys.time()

# Преобразуем в формат POSIXlt
current_time_lt <- as.POSIXlt(current_time_ct)

# извлекаем компоненты даты и времени
current_time_lt$sec   # секунды
current_time_lt$min   # минуты
current_time_lt$hour  # часы
current_time_lt$mday  # день месяца
current_time_lt$mon   # месяц
current_time_lt$year  # год
current_time_lt$wday  # день недели
current_time_lt$yday  # день года
current_time_lt$zone  # часовой пояс

Сандык жана тексттик маалыматтарды форматтарга айландыруу POSIX* функциялары аркылуу ишке ашырылат as.POSIXct() и as.POSIXlt(). Бул функцияларда аргументтердин кичинекей топтому бар.

  • x — Сан, сап же класс объекти дата, аны өзгөртүү керек;
  • tz — Убакыт алкагы, демейки "GMT";
  • формат — х аргументине берилген маалыматтар берилген дата форматынын сүрөттөлүшү;
  • келип чыгышы — Санды POSIXке айландырганда гана колдонулат; бул аргументке секундалар саналган дата объектисин жана убакытты өткөрүп беришиңиз керек. Адатта UNIXTIMEден которуу үчүн колдонулат.

Эгер сиздин дата жана убакыт маалыматыңыз болсо UNIXTIME, андан кийин аларды так, окула турган датага айландыруу үчүн, төмөнкү мисалды колдонуңуз:

# Конвертируем UNIXTIME в читаемую дату 
as.POSIXlt(1570084639,  origin = "1970-01-01")

Баштапкыда сиз каалаган убакыт белгисин көрсөтө аласыз. Мисалы, эгер сиздин маалыматтарыңызда 15-жылдын 2019-сентябрынан тартып саат 12:15тен берки секунданын саны катары дата жана убакыт камтылган болсо, аны датага айландыруу үчүн:

# Конвертируем UNIXTIME в дату учитывая что начало отсчёта 15 сентября 2019 12:15
as.POSIXlt(1546123,  origin = "2019-09-15 12:15:00")

lubridate пакетин колдонуу менен даталар менен иштөө

lubridate Балким, R тилиндеги даталар менен иштөө үчүн эң популярдуу пакет. Ал сизге кошумча үч классты берет.

  • узактыгы — узактыгы, б.а. эки убакыт белгисинин ортосундагы секунданын саны;
  • мөөнөттөр - мөөнөттөр адам окуй турган интервалдарда даталардын ортосундагы эсептөөлөрдү жүргүзүүгө мүмкүндүк берет: күндөр, айлар, жумалар жана башкалар;
  • интервалдар - убакыттын башталышын жана аяктоосун камсыз кылуучу объекттер.

R тилиндеги кошумча пакеттерди орнотуу стандарттык функцияны колдонуу менен ишке ашырылат install.packages().

Пакет орнотулууда lubridate:

install.packages("lubridate")

lubridate колдонуп бүгүнкү күнгө чейин текстти айландыруу

Пакеттин өзгөчөлүктөрү lubridate текстти датага айландыруу процессин кыйла жөнөкөйлөштүрүү, ошондой эле даталар жана убакыттар менен ар кандай арифметикалык операцияларды жүргүзүүгө мүмкүндүк берет.

Функциялар учурдагы датаны же дата менен убакытты алууга жардам берет today() и now().

today() # текущая дата
now()   # текущая дата и время

Сапты датага айландыруу үчүн lubridate Функциялардын бүтүндөй үй-бүлөсү бар, алардын аттары ар дайым үч тамгадан турат жана дата компоненттеринин ырааттуулугун көрсөтөт:

  • ж - жыл
  • м - ай
  • d - күн

Текстти lubridate аркылуу күнгө айландыруу функцияларынын тизмеси

  • ymd()
  • ydm()
  • mdy()
  • myd()
  • dmy()
  • dym()
  • yq()

Саптарды даталарга которуу үчүн кээ бир мисалдар:

ymd("2017 jan 21")
mdy("March 20th, 2019")
dmy("1st april of 2018")

Көрүнүп тургандай lubridate Бул даталардын сүрөттөмөлөрүн текст катары таанууда алда канча натыйжалуу жана форматты сүрөттөө үчүн кошумча операторлорду колдонбостон, текстти бүгүнкү күнгө которууга мүмкүндүк берет.

lubridate пакетин колдонуу менен датасы компоненттерин казып алуу

Ошондой эле колдонуу lubridate бир күндөн каалаган компонентти ала аласыз:

dt <- ymd("2017 jan 21")

year(dt)  # год
month(dt) # месяц
mday(dt)  # день в месяце
yday(dt)  # день в году
wday(dt)  # день недели

Даталар менен арифметикалык амалдар

Бирок эң маанилүү жана негизги функция lubridate даталар менен ар кандай арифметикалык амалдарды аткаруу жөндөмдүүлүгү болуп саналат.

Датаны тегеректөө үч функция менен аткарылат:

  • floor_date — жакынкы өткөн чакка чейин тегеректөө
  • ceiling_date — жакынкы келер чакка тегеректөө
  • round_date - жакынкы убакытка чейин тегеректөө

Бул функциялардын ар биринин аргументи бар бирдигитегеректөө бирдигин көрсөтүүгө мүмкүндүк берет: секунд, мүнөт, саат, күн, жума, ай, эки ай, квартал, мезгил, жарым жыл, жыл

dt <- ymd("2017 jan 21")

round_date(dt, unit = "month")    # округлить до месяца
round_date(dt, unit = "3 month")  # округлить до 3 месяцев
round_date(dt, unit = "quarter")  # округлить до квартала
round_date(dt, unit = "season")   # округлить до сезона
round_date(dt, unit = "halfyear") # округлить до полугодия

Келгиле, учурдагы күндөн 8 күндөн кийин болгон датаны кантип алуу керектигин жана эки датанын ортосунда ар кандай арифметикалык эсептөөлөрдү жүргүзөлү.

today() + days(8)   # какая дата будет через 8 дней
today() - months(2) # какая дата была 2 месяца назад
today() + weeks(12) # какая дата будет через 12 недель
today() - years(2)  # какая дата была 2 года назад

Мөөнөттөр менен жөнөкөйлөштүрүлгөн иш, timeperiodsR пакети.

timeperiodsR - 2019-жылдын сентябрында CRANда жарыяланган даталар менен иштөө үчүн жаңы пакет.

Пакет орнотулууда timeperiodsR:

install.packages("timeperiodsR")

Негизги максаты - берилген датага салыштырмалуу белгилүү бир убакыт аралыгын тез аныктоо. Мисалы, анын функцияларын колдонуу менен сиз оңой кыла аласыз:

  • Акыркы жуманы, айды, кварталды же жылды R менен алыңыз.
  • Датага, мисалы, акыркы 4 аптага салыштырмалуу белгилүү бир убакыт аралыгын алыңыз.
  • Пайда болгон убакыт аралыгынан анын компоненттерин алуу оңой: башталыш жана аяктоо датасы, интервалга кирген күндөрдүн саны, ага кирген даталардын бардык ырааты.

Бардык пакет функцияларынын аталышы timeperiodsR интуитивдик жана эки бөлүктөн турат: багыт_аралыкбул жерде:

  • багыт анда сиз берилген датага салыштырмалуу жылышыңыз керек: акыркы_n, мурунку, бул, кийинки, кийинки_n.
  • убактылуу аралык мезгилди эсептөө үчүн: күн, жума, ай, квартал, жыл.

Функциялардын толук топтому:

  • last_n_days()
  • last_n_weeks()
  • last_n_months()
  • last_n_quarters()
  • last_n_years()
  • previous_week()
  • previous_month()
  • previous_quarter()
  • previous_year()
  • this_week()
  • this_month()
  • this_quarter()
  • this_year()
  • next_week()
  • next_month()
  • next_quarter()
  • next_year()
  • next_n_days()
  • next_n_weeks()
  • next_n_months()
  • next_n_quarters()
  • next_n_years()
  • custom_period()

Убакыт аралыктары R

Бул функциялар өткөн жумадагы же айдагы маалыматтардын негизинде отчетторду түзүшүңүз керек болгон учурларда пайдалуу. Акыркы айды алуу үчүн, ошол эле аталыштагы функцияны колдонуңуз previous_month():

prmonth <- previous_month()

Андан кийин сизде объект болот premonth тап тпр, андан төмөнкү компоненттерди оңой алууга болот:

  • мезгилдин башталышы, биздин мисалда бул акыркы ай
  • мезгилдин аяктоо күнү
  • мезгилге киргизилген күндөрдүн саны
  • мезгилге киргизилген даталардын ырааттуулугу

Мындан тышкары, сиз компоненттердин ар бирин ар кандай жолдор менен ала аласыз:

# первый день периода
prmonth$start
start(prmonth)

# последний день периода
prmonth$end
end(prmonth)

# последовательность дат
prmonth$sequence
seq(prmonth)

# количество дней входящих в период
prmonth$length
length(prmonth)

Ошондой эле аргументти колдонуу менен компоненттердин каалаганын ала аласыз бөлүк, бул пакеттин функцияларынын ар биринде бар. Мүмкүн болгон баалуулуктар: башталышы, аягы, ырааттуулугу, узундугу.

previous_month(part = "start")    # начало периода
previous_month(part = "end")      # конец периода
previous_month(part = "sequence") # последовательность дат
previous_month(part = "length")   # количество дней в периоде

Ошентип, келгиле, пакет функцияларында бар бардык аргументтерди карап көрөлү timeperiodsR:

  • x — убакыт аралыгы эсептеле турган маалымдама датасы, демейки боюнча учурдагы дата;
  • n — Мезгилге киргизиле турган интервалдардын саны, мисалы, мурунку 3 жума;
  • part — Объекттин кайсы компоненти tpr демейки боюнча алуу керек all;
  • week_start — Аргумент жумалар менен иштөө функцияларында гана болот жана анын башталышы деп эсептеле турган аптанын күнүнүн санын коюуга мүмкүндүк берет.Демейки боюнча, жуманын башталышы дүйшөмбү, бирок сиз каалаган убактан баштап орното аласыз. 1 - дүйшөмбүдөн 7 - жекшембиге чейин.

Ошентип, сиз учурдагы же башка берилген датага салыштырмалуу каалаган убакыт аралыгын эсептей аласыз; бул жерде дагы бир нече мисал келтирилген:

# получить 3 прошлые недели
# от 6 октября 2019 года
# начало недели - понедельник
last_n_weeks(x = "2019-10-06", 
             n = 3, 
             week_start = 1)

 Time period: from  9 September of 2019, Monday to 29 September of 2019, Sunday

6-октябрь жекшемби:
R ичинде даталар менен иштөө (негизги мүмкүнчүлүктөр, ошондой эле майлоочу жана убакыттын R пакеттери)

Бизге 6-октябрга салыштырмалуу мурунку 3 жума талап кылынган мөөнөт керек. 6-октябрдын өзүн камтыган жуманы кошпогондо. Ошого жараша бул 9-сентябрдан 29-сентябрга чейинки мезгил.

R ичинде даталар менен иштөө (негизги мүмкүнчүлүктөр, ошондой эле майлоочу жана убакыттын R пакеттери)

# получить месяц отстающий на 4 месяца
# от 16 сентября 2019 года
previous_month(x = "2019-09-16", n = 4)

 Time period: from  1 May of 2019, Wednesday to 31 May of 2019, Friday

Бул мисалда биз 4 ай мурун болгон айга кызыгып жатабыз, эгерде биз 16-жылдын 2019-сентябрынан баштасак, анда ал 2019-жылдын май айы болчу.

timeperiodsR аркылуу даталардын векторун чыпкалоо

Даталарды чыпкалоо үчүн timeperiodsR бир нече операторлор бар:

  • %left_out% - tpr классынын эки объектисин салыштырып, оң жакта жок солдун маанисин кайтарат.
  • %left_in% - tpr классынын эки объектисин салыштырат жана оңго кирген сол объекттен даталарды кайтарат.
  • %right_out% - tpr классынын эки объектисин салыштырып, оңдон солдон жетишпеген маанини кайтарат.
  • %right_in% - tpr классынын эки объектисин салыштырат жана сол жактагы оң объекттен даталарды кайтарат.

period1 <- this_month("2019-11-07")
period2 <- previous_week("2019-11-07")

period1 %left_in% period2   # получить даты из period1 которые входят в period2
period1 %left_out% period2  # получить даты из period1 которые не входят в period2
period1 %right_in% period2  # получить даты из period2 которые входят в period1
period1 %right_out% period2 # получить даты из period2 которые не входят в period1

Пакетте timeperiodsR расмий, орус тилдүү бар YouTube ойнотмо тизмеси.

жыйынтыктоо

Биз даталар менен иштөө үчүн R тилинде иштелип чыккан объекттердин класстарын деталдуу карап чыктык. Ошондой эле азыр сиз даталар боюнча арифметикалык амалдарды аткарып, пакеттин жардамы менен каалаган убакыт аралыгын тез ала аласыз timeperiodsR.

Эгер сиз R тилине кызыгып жатсаңыз, мен сизди менин телеграм каналыма жазылууга чакырам R4marketing, анда мен күнүмдүк көйгөйлөрүңүздү чечүүдө R тилин колдонуу боюнча пайдалуу материалдар менен бөлүшөм.

Source: www.habr.com

Комментарий кошуу