首页 > 解决方案 > 我需要帮助编写一个函数来使用 R 中的 lubridate 计算一个时间段内的假期数

问题描述

我正在尝试编写一个函数来计算一个人在 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)

但是得到了一个错误参数。

有人有建议吗?

标签: rfunctionapplydata-sciencelubridate

解决方案


将假期放入向量中:

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")

生成一些随机数据进行测试(2017年1000个均匀分布的工作条目,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 年,但不适用于闰年(不涉及过多更改代码的一种解决方法是手动更改假期向量中的年份)。


推荐阅读