检查当前日期是否在日期间隔之间,并将每个日期的结果导出到单独的Excel工作表中

时间:2019-01-27 10:27:15

标签: r dplyr tidyverse purrr lubridate

我有一个带有两个日期列的日期框架(四个变量),分别是start_holiday和end_holiday,我试图检查假日日期范围内是否有特定日期,然后将那个特定日期的结果导出为一个Excel工作表。

我的输入:

df <- tibble::tribble(
      ~Code, ~Member_Id, ~Start.Holiday, ~End.Holiday,
  18100532L,         2L,      20190118L,    20190203L,
  18101425L,         1L,      20190118L,    20190203L,
  18101425L,         2L,      20181218L,    20190102L,
  18102843L,         1L,      20181222L,    20190101L,
  18103202L,         1L,      20190202L,    20190303L,
  18103202L,         2L,      20190202L,    20190303L,
  18104148L,         1L,      20181215L,    20181229L,
  18104148L,         2L,      20181215L,    20181229L,
  18105261L,         1L,      20181204L,    20181230L,
  18105261L,         2L,      20190109L,    20190114L,
  18105261L,         3L,      20181205L,    20181222L,
  18107386L,         1L,      20181205L,    20181222L,
  18107429L,         2L,      20181205L,    20181222L,
  18108931L,         1L,      20181217L,    20190110L,
  18109405L,         1L,      20190123L,    20190208L,
  18109405L,         2L,      20190123L,    20190208L,
  18113785L,         1L,      20190118L,    20190122L,
  18114041L,         1L,      20190118L,    20190122L,
  18114329L,         1L,      20181213L,    20181222L,
  18114329L,         2L,      20181213L,    20181222L)

到目前为止,我已经做到了,这将给我那些在1月1日度假的人。但是,我正在寻找一种更智能的方法,用更少的代码。假设我要检查1月1日到1月11日,使用这种方法,我必须重新运行脚本11次,并分别为每个日期导出。有没有一种方法可以用来检查某个日期是否在这两个间隔内,并且对于每个日期,将输出导出为一张Excel工作表?例如,对于1月1日(仅查看我的样本数据),有3个人在度假并将其导出为一个excel工作表呼叫0101,对于1月2日,有2个人在度假并且将结果导出为一个工作表呼叫0201,依此类推。我希望我足够清楚

仅适用于1月1日

library(lubridate)
library(tidyverse)


df_interval <- df %>%
  janitor::clean_names() %>% 
  mutate(
    Start_H = ymd(start_holiday),
    End_H = ymd(end_holiday), 
    # Create an interval object.
    holiday_Interval = interval(start = Start_H, end = End_H),
    flag = case_when(
      ymd("2019-01-01") %within% holiday_Interval ~ 1,
      TRUE ~ 0)) %>% 
  select(-holiday_Interval)

更清楚地说,期望的输出 enter image description here

1 个答案:

答案 0 :(得分:3)

在这里您将收到每个日期的一个.xlsx文件和表格:

library(dplyr)
library(lubridate)
library(openxlsx)


df <- 
  df %>%
  mutate_at(3:4, ymd)

dates <-
  seq(
    df$Start.Holiday %>% min(),
    df$End.Holiday %>% max(),
    1
  ) %>%
  as.character()

wb <- createWorkbook()

for (d in dates) {
  temp <-
    df %>%
    filter(Start.Holiday <= ymd(d) & End.Holiday >= ymd(d))
    addWorksheet(wb, sheetName = d)
    writeData(wb, d, temp)
}

saveWorkbook(wb, 'holidays.xlsx')