2017-06-14 92 views
0

我试图弄清楚在给定时间(抵达和结帐时间之间)有多少人在办公室。我有一个没有NA值的数据帧。我想计算每5分钟的音量。R:计算两次之间的行数

library(timeDate) 
    #change from factor to datetime 
data$ArrivalDtm<- timeDate(data$ArrivalDtm) 
data$CheckoutDtm<- timeDate(data$CheckoutDtm) 

然后我创建5钟座:

#make a df of 5 minute intervals 
blocks <- as.data.frame(seq(from= timeDate("2015-12-31 23:00:00"), to=timeDate("2017-06-13 23:00:00"), by='5 mins')) 

然后我试图通过走访的DF迭代计算有多少人已签,但在该块时都查不出来。

for (i in blocks) { 
    for (visit in 1:nrow(data)){ 
     waitingroom <- sum(data$ArrivalDtm[visit] > i & i < data$CheckoutDtm[visit]) 
    } 
} 

当我运行的循环我得到这个错误:

Error in sum(data$ArrivalDtm[visit]) : invalid 'type' (S4) of argument

数据

ArrivalDtm<- c("2016-05-10 20:34:00", "2016-04-13 22:46:00", "2016-12-15 13:18:00", "2016-02-26 18:32:00", "2016-04-25 13:55:00") 
CheckoutDtm <- c("2016-05-10 20:37:00", "2016-04-14 00:23:00", "2016-12-15 13:27:00", "2016-02-26 18:53:00", "2016-04-25 14:33:00") 
+0

您能否提供一些样本数据以帮助那些可能试图回答的人? – BLT

+0

您有权利,而不是最好的方法,但需要查看一些示例数据来调试错误。 – Masoud

+0

以下是一些示例数据。 ArrivalDtm < - c(“2016-05-10 20:34:00”,“2016-04-13 22:46:00”,“2016-12-15 13:18:00”,“2016-02-26 18:32:00“,”2016-04-25 13:55:00“) CheckoutDtm < - c(”2016-05-10 20:37:00“,”2016-04-14 00:23: 00“,”2016-12-15 13:27:00“,”2016-02-26 18:53:00“,”2016-04-25 14:33:00“) – mzee

回答

0

我发现了一个更优雅的(合法的)的方式来做到这一点: 我创建10分钟箱和使用的lubridate来测试访问跨度是否与容器重叠并且计算每个容器有多少TRUE值。运行需要很长时间 - 可以进行优化。但这是一个开始。

diff <- make_difftime(minutes=10) 
as.interval(diff, ymd_hms("2017-01-01 00:00:00")) 
intervals <- as.interval(diff, seq(from= ymd_hms("2017-01-01 00:00:00"), to=ymd_hms("2017-06-13 23:00:00"), by='10 mins')) 

span <- interval(recentdata$ArrivalDtm, recentdata$CheckoutDtm) 


#int_overlaps(intervals,span) 


waitingroom <- intervals 
waitingroom <- as.data.frame(waitingroom) 
waitingroom$count <- 0 

for (interval in 1:length(intervals)){ 
    (waitingroom$count[interval] <- sum(int_overlaps(intervals[interval], span)==TRUE)) 
}