r - 计算一个表中的日期范围和另一个表中的天数标准的天数
问题描述
我的一张表有最后两列中提到的日期数据:
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
解决方案
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
推荐阅读
- javascript - 尝试创建队列时出现 ChromeCast session_error
- kubernetes - 将 pod 分配给工作人员,而不使用 nodeSelector 等特定于部署的内容。安全约束
- enterprise-architect - Enterprise Architect - SysML 图表标题
- python - Python Matplotlib Circle 问题
- sql - 改进包含多个子查询的 SQL 查询
- android - 无法完成会话:INSTALL_FAILED_NO_MATCHING_ABIS:无法提取本机库,res=-113
- database-backups - MS SQL 2017 Express:还原备份时出现奇怪错误
- python - 如何检查任意类实例是否存在并从另一个模块调用其方法?
- github - npm 安装一个分叉的分支
- regex - Angular 5 表单自定义验证无法正常工作