首页 > 解决方案 > 计算一个表中的日期范围和另一个表中的天数标准的天数

问题描述

我的一张表有最后两列中提到的日期数据:

dat<- data.frame(a = c(rep("x",3)),
                 date1=c(seq(as.Date("2018-01-01"), as.Date("2018-01-3"), 1)), 
                 date2=c(seq(as.Date("2018-01-08"), as.Date("2018-01-10"), 1)))

日期1 日期2

1 x 2018-01-01 2018-01-08

2 x 2018-01-02 2018-01-09

3 x 2018-01-03 2018-01-10

我的另一张桌子每天是怎样的一天

cal <- data.frame(dt = c(seq(as.Date("2018-01-01"), as.Date("2018-01-10"),1)),
                  day = c(rep("workday",5), rep("holiday",1), rep("weekend",4)))

如何将表 1(dat) 中的天数作为新列获取,以便它仅计算第 2 列和第 3 列中提到的范围内的工作日?

具有 4 列的示例输出。最后一列是前两列中日期范围的工作日数

  a      date1      date2     countdown
1 x 2018-01-01   2018-01-08           5
2 x 2018-01-02   2018-01-09           4
3 x 2018-01-03   2018-01-10           3

标签: rdata.table

解决方案


data.table解决方案

library( data.table )
#set data to data.table format
setDT(dat); setDT(cal)
setkey(dat, date1, date2 )
dat[dat, 
    N := { val = cal[ day == "workday" & dt >= i.date1 & dt <= i.date2 ]
           list( nrow( val ) ) }, 
    by = .EACHI ]

#    a      date1      date2 N
# 1: x 2018-01-01 2018-01-08 5
# 2: x 2018-01-02 2018-01-09 4
# 3: x 2018-01-03 2018-01-10 3

更新 data.table::foverlaps() 解决方案

library( data.table )
#set data to data.table format
setDT(dat); setDT(cal)
#create dummy date
cal[,dt2 := dt]
#set keys
setkey( dat, date1, date2 )
setkey( cal, dt, dt2 )
#overlap join
ans <- foverlaps( dat, cal )
#summarise
ans[, .( countdown = uniqueN( dt[day == "workday"] ) ), by = .(a, date1, date2)][]
#    a      date1      date2 countdown
# 1: x 2018-01-01 2018-01-08         5
# 2: x 2018-01-02 2018-01-09         4
# 3: x 2018-01-03 2018-01-10         3

推荐阅读