2012-06-13 280 views
4

我有一個數據框,其中包含開始日期和結束日期以及註冊事件的人數。我想計算的小時數每一方存在一個特定的時間內(例如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

回答

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 

基本上我們識別每個聚會規模多少天停留。對於給定的一天,我們找到適用的開放和關閉。然後我們從最後減去開放。數據幀最終形成,但它可能已創建在資源< - 步驟.....

+0

是的,醜陋的...但它的作品:)謝謝! – JimmyT

+1

今天我玩這個,唯一修改是我爲可讀性做的唯一修改是使用一個序列創建app.days app.days < - mapply(function(x,y){seq(x,y,by =「day」)} (格式(d $ startDate,「%Y-%m-%d」)), as.POSIXct(format(d $ endDate,「%Y-%m-%d」))) – JimmyT

相關問題