Problem

目前,我有一个大型的机组时刻表数据集,有开始和结束时间,我的目标是确定员工是否在上夜班.夜班定义为01:00:00至05:59:59之间的任何班次.我已经研究过%overlaps%之类的函数,但它们似乎不适用于仅时间戳.一些示例数据(UTC tz):

library(lubridate)
df <- data.frame(start = ymd_hms(c("2018-09-19 23:30:00", "2018-09-19 17:00:00", "2018-09-22 04:30:00")),
                 end = ymd_hms(c('2018-09-20 07:05:00', "2018-09-19 21:00:00", "2018-09-22 12:00:00")))

Solution

理想情况下,我希望得到以下输出,带有一个布尔变量,指示员工是否上夜班:

               start                 end    night.shift
2018-09-19 23:30:00 | 2018-09-20 07:05:00 |  TRUE
2018-09-19 17:00:00 | 2018-09-19 21:00:00 |  FALSE
2018-09-22 04:30:00 | 2018-09-22 12:00:00 |  TRUE

提前谢谢!

推荐答案

使用seq.POSIXt

transform(df, night.shift=mapply(\(x, y) any(
  as.POSIXct(outer(as.Date(c(x, y)), c('01:00:00', '05:59:59'), paste), tz='GMT') %in% 
    seq.POSIXt(x, y, by='sec')), 
  start, end))
#                 start                 end night.shift
# 1 2018-09-19 23:30:00 2018-09-20 07:05:00        TRUE
# 2 2018-09-19 17:00:00 2018-09-19 21:00:00       FALSE
# 3 2018-09-22 04:30:00 2018-09-22 12:00:00        TRUE

或者,速度几乎是data.table套餐的两倍.

library(data.table)

transform(df, night.shift=mapply(\(x, y) any(
  as.POSIXct(outer(as.Date(c(x, y)), c('01:00:00', '05:59:59'), paste), tz='GMT') %inrange% 
    c(x, y)), 
  start, end))
#                 start                 end night.shift
# 1 2018-09-19 23:30:00 2018-09-20 07:05:00        TRUE
# 2 2018-09-19 17:00:00 2018-09-19 21:00:00       FALSE
# 3 2018-09-22 04:30:00 2018-09-22 12:00:00        TRUE

R相关问答推荐

如何使用`ggplot2::geom_segment()`或`ggspatial::geom_spatial_segment()`来处理不在格林威治中心的sf对象?

R中的子集文件—读取文件名索引为4位数字序列,例如0001到4000,而不是1到4000)

隐藏e_mark_line的工具提示

在"gt"表中添加第二个"groupname_col",而不连接列值

如何直接从R中的风险分数计算c指数?

R:从geom_ol()中删除轮廓并导出为pdf

根据1个变量绘制 colored颜色 发散的 map ,由另一个变量绘制饱和度,ggplot2不工作

悬崖三角洲超大型群数计算导致整数溢出

如何将Which()函数用于管道%>;%

按组计算列中1出现的间隔年数

如何使这些react 表对象相互独立?

如何用不同长度的向量填充列表?

如何在访问之前下载的输入时同时上传和处理所有指定的shiny 输入?

基于R中的引用将向量值替换为数据框列的值

重写时间间隔模糊连接以减少内存消耗

组合名称具有模式的列表的元素

对数据帧中的列进行子集设置以通过迭代创建新的数据帧

使用卡环从R中的列中删除单位(&C)

创建两个变量组合的索引矩阵

如何根据每个子框架中分类因子的唯一计数来过滤子框架列表?