Количество дней до праздника - PullRequest
4 голосов
/ 07 апреля 2019

Во-первых, я сохранил все даты праздников отдельно и хотел определить, какие из дат в моем наборе данных являются выходными, выполнив:

publicHolidays <- as.Date(c("2019-01-01", "2019-01-15", "2019-01-26", "2019-03-04", "2019-03-21", "2019-04-06"))

sampledata <- data.frame(
   sid = c (1:5), 
   DOJ = c("21/03/2019", "26/1/2019", "1/03/2019", "12/03/2019", "1/1/2019"),
   stringsAsFactors = FALSE
)

sampledata$isholiday <- as.numeric(as.Date(sampledata$DOJ,'%d/%m/%Y') %in% publicHolidays)
#sampledata$isholiday

str(sampledata)

Далее я хочу найти для каждой даты, сколько дней до ближайшего праздника (вперед или назад). Как я могу продолжить?

Ответы [ 2 ]

3 голосов
/ 07 апреля 2019

Более эффективным, чем сравнение всех дней со всеми праздниками, является использование сортировки;это делается с помощью подвижных соединений data.table:

library(data.table)
setDT(sampledata)

sampledata[ , DOJ := as.IDate(DOJ, '%d/%m/%Y')]
setkey(sampledata, DOJ)

holidays = data.table(date = as.IDate(publicHolidays))
holidays[ , I := .I]
setkey(holidays)

sampledata[ , nearest_holiday := {
  idx = holidays[copy(.SD), I, roll = 'nearest']
  holidays$date[idx]
}]
sampledata[]
#    sid        DOJ nearest_holiday
# 1:   5 2019-01-01      2019-01-01
# 2:   2 2019-01-26      2019-01-26
# 3:   3 2019-03-01      2019-03-04
# 4:   4 2019-03-12      2019-03-04
# 5:   1 2019-03-21      2019-03-21

С этим легко вычислить расстояние:

sampledata[ , days_to_nearest := nearest_holiday - DOJ][]
#    sid        DOJ nearest_holiday days_to_nearest
# 1:   5 2019-01-01      2019-01-01               0
# 2:   2 2019-01-26      2019-01-26               0
# 3:   3 2019-03-01      2019-03-04               3
# 4:   4 2019-03-12      2019-03-04              -8
# 5:   1 2019-03-21      2019-03-21               0
2 голосов
/ 07 апреля 2019

Подход базового R с использованием sapply заключается в проверке абсолютного значения imum min между каждым DOJ и publicHolidays

sampledata$nearest_holiday <- sapply(as.Date(sampledata$DOJ, "%d/%m/%Y"),
                        function(x) min(abs(x - publicHolidays)))

sampledata
#  sid        DOJ isholiday nearest_holiday
#1   1 21/03/2019         1               0
#2   2  26/1/2019         1               0
#3   3  1/03/2019         0               3
#4   4 12/03/2019         0               8
#5   5   1/1/2019         1               0

Если вы хотите использовать это в цепочке dplyr, мы можем перевести ту же логику

library(dplyr)
library(lubridate)
library(purrr)

sampledata %>%
    mutate(nearest_holiday =  map_dbl(dmy(DOJ), ~min(abs(. - publicHolidays))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...