Мне нужна помощь в написании функции для подсчета количества выходных в течение определенного периода времени с использованием lubridate в R
Я пытаюсь написать функцию, которая подсчитывает количество отпусков, которые человек проработал в моей организации, между датой его начала и датой семестра в 2017 году. Моя организация признала 6 праздников в этом году.
Новый год - 2017-01-02
День памяти- 2017-05-29
День Независимости - 2017-07-04
День труда - 2017-09-04
День благодарения - 2017-11-23
Рождество - 2017-12-25
Я использовал lubridate для объединения столбцов год-месяц-день в полные даты, используя lubridate и dyplr следующим образом:
dates<- data %>% mutate("Term Date" = make_date(month = `Term Month`,
day = data$`Term Day`,
year =data$`Term Year`),
"Start Date"= make_date(month = data$`Start Month`,
day = data$`Start Day`,
year = data$`Start Year`))
Затем я попытался написать свою функцию.
holidays <- function(x){
z<- 0
if( ymd("2017-01-01") %within% interval(dates$`Start Date`, dates$`Term Date`)){
z <- z + 1
}
print(z)
}
Это был только мой первый шаг. Моя цель состояла в том, чтобы сначала заставить мою функцию работать в течение новых лет, а затем продолжать строить другие праздники, шаг за шагом, используя операторы if. Мне не удалось заставить функцию apply работать правильно, и я не уверен, работает ли моя функция. Я попытался применить функцию следующим образом:
apply(dates,2,holidays)
Но получил аргумент об ошибке.
У кого-нибудь есть совет?
1 ответ
Положить праздники в векторе:
holidays <- as.Date(c('2017-01-02', '2017-05-29', '2017-07-04', '2017-09-04', '2017-11-23', '2017-12-25'))
Извлекая месяц и день (чтобы сделать его независимым от года), "%j" обозначает день года:
holidays <- format(as.Date(holidays), "%j")
Генерация случайных данных для тестирования (1000 равномерно распределенных рабочих записей в 2017 году, 5 сотрудников):
d <- data.frame(
'date' = as.Date(as.integer(runif(1000, 17167, 17531)), origin = '1970-01-01'),
'emp' = sample(LETTERS[1:5], 1000, replace = T)
)
Фильтрация праздников:
h <- d[format(d$date, "%j") %in% holidays, ]
Подсчет количества отпусков на одного работника aggregate()
:
aggregate(h$date, list(h$emp), length)
# Group.1 x
#1 A 3
#2 B 4
#3 C 2
#4 D 5
#5 E 1
NB: будет работать в 2017 году, но не будет работать в високосные годы (один из обходных путей, который не требует слишком большого изменения кода, - это изменение года в векторе праздников вручную).