我有一个包含开始日期和结束日期的数据框,以及为活动注册的人数。我想计算每个参与方在特定时间范围内(例如,07:00-17:00)的小时数。
如果我使用以下示例data.frame ...
d <- data.frame(startDate = c(as.POSIXct("2011-06-04 08:00:00"), as.POSIXct("2011-06-03 08:00:00"),
as.POSIXct("2011-09-12 10:00:00")),
endDate = c(as.POSIXct("2011-06-06 11:00:00"), as.POSIXct("2011-06-04 11:00:00"),
as.POSIXct("2011-09-12 18:00:00")),
partysize = c(124,442,323))
open <- "07:00"
close <- "17:00"
我希望我的结果集看起来像这样:
day numhours partysize
2011-06-04 9 124
2011-06-05 10 124
2011-06-06 4 124
2011-06-03 9 442
2011-06-04 4 442
2011-09-12 7 323
注意:numhours是开放和关闭时间之间包含日期的小时数
提前致谢, --JT
答案 0 :(得分:3)
对不起它非常凌乱,我使用7和17而不是你的开放和关闭
app.days<-mapply(function(x,y){x+y*60*60*24},as.POSIXct(format(d$startDate,"%Y-%m-%d")),lapply(floor(-(d$startDate-d$endDate)/24),seq,from=0))
start.date<-mapply(function(x,y){pmax(x+7*60*60,y)},app.days,d$startDate)
end.date<-mapply(function(x,y){pmin(x+17*60*60,y)},app.days,d$endDate)
app.hours<-mapply(function(x,y){as.numeric(x-y)},end.date,start.date)
res<-mapply(function(x,y,z){data.frame(day=as.Date(x),numhours=y,partysize=z)},app.days,app.hours,as.list(d$partysize))
res1<-data.frame(day=as.Date(unlist(res[1,]),origin="1970-01-01"),numhours=unlist(res[2,]),partysize=unlist(res[3,]))
> res1
day numhours partysize
1 2011-06-04 9 124
2 2011-06-05 10 124
3 2011-06-06 4 124
4 2011-06-03 9 442
5 2011-06-04 4 442
6 2011-09-12 7 323
基本上我们会确定每个派对规模的停留天数。在给定的一天,我们找到适用的开放和关闭。然后我们从close中减去open。最终形成了数据帧,但它可能是在res&lt; - step .....
中创建的