答案 0 :(得分:1)
如果我理解你的问题,这里有一个假数据的例子:
library(tidyverse)
library(lubridate)
# Fake data
set.seed(2)
dat = data.frame(id=1:1000, type=rep(c("A","B"), 500),
arrival=as.POSIXct("2013-08-21 05:00:00") + sample(-10000:10000, 1000, replace=TRUE))
dat$departure = dat$arrival + sample(100:5000, 1000, replace=TRUE)
# Times when we want to check how many people are still present
times = seq(round_date(min(dat$arrival), "hour"), ceiling_date(max(dat$departure), "hour"), "30 min")
# Count number of people present at each time
map_df(times, function(x) {
dat %>%
group_by(type) %>%
summarise(Time = x,
Count=sum(arrival < x & departure > x)) %>%
spread(type, Count) %>%
mutate(Total = A + B)
})
Time A B Total <dttm> <int> <int> <int> 1 2013-08-21 02:00:00 0 0 0 2 2013-08-21 02:30:00 26 31 57 3 2013-08-21 03:00:00 54 53 107 4 2013-08-21 03:30:00 75 81 156 5 2013-08-21 04:00:00 58 63 121 6 2013-08-21 04:30:00 66 58 124 7 2013-08-21 05:00:00 55 60 115 8 2013-08-21 05:30:00 52 63 115 9 2013-08-21 06:00:00 57 62 119 10 2013-08-21 06:30:00 62 51 113 11 2013-08-21 07:00:00 60 67 127 12 2013-08-21 07:30:00 72 54 126 13 2013-08-21 08:00:00 66 46 112 14 2013-08-21 08:30:00 19 12 31 15 2013-08-21 09:00:00 1 2 3 16 2013-08-21 09:30:00 0 0 0 17 2013-08-21 10:00:00 0 0 0
答案 1 :(得分:0)
我不确定你的意思是计算系统中的人数和#34;但是我假设你的意思是&#34;到达的人数但尚未离开&#34;。为此,您可以在数据框的相关列上应用简单的逻辑条件,例如
logicVec <- df$arrival_time <= dateTimeObj & dateTimeObj < df$departure_time
LogicVec显然是TRUE和FALSE的逻辑向量。因为TRUE == 1且FALSE == 0,所以您可以简单地使用sum(logicVec)
函数来获得满足上述条件的人/客户/行总数。
然后,您可以为所需的每个dateTimeObj(例如POSIXct类)重复此行代码。在你的情况下,每个dateTimeObj都会相隔30分钟。
我希望这会有所帮助。