Мне нужна помощь в написании функции для подсчета количества выходных в течение определенного периода времени с использованием lubridate в R - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь написать функцию, которая подсчитывает количество отпусков, которые человек проработал в моей организации, между его датой начала и датой семестра в 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 Ответ

0 голосов
/ 13 ноября 2018

Помещая выходные в векторе:

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

Примечание: будет работать в 2017 году, но не будет работать в течение високосных лет (один из обходных путей, который не требует слишком большого изменения кода, - это изменение года ввектор праздника вручную).

...