r - 我需要帮助编写一个函数来使用 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)
但是得到了一个错误参数。
有人有建议吗?
解决方案
将假期放入向量中:
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 年,但不适用于闰年(不涉及过多更改代码的一种解决方法是手动更改假期向量中的年份)。
推荐阅读
- java - Apache骆驼从body()中获取价值
- c - 使用 termios 发送 AT 命令并获得回复的正确方法是什么
- jquery - jQuery 遍历——包含特定元素的父级最近的兄弟
- javascript - 如何使用 JavaScript XMLHttpRequest 获取日志文件并显示它
- r - 对不同变量使用平均插补
- javascript - Apple Maps 链接无法通过 Chrome for iOS 打开本机应用程序
- c++ - 为什么这个结合赋值和相等检查的 if 语句返回 true?
- python-3.x - 如何自动以“智能”方式进行算法轮次
- google-apps-script - GmailApp.sendEmail() 将自定义“发件人”添加到电子邮件正文
- c - 在 macOS 上构建 APT(我已经完成了大部分端口)但出现错误“使用未声明的标识符 'GetSrvRecords'”