R图重叠时间间隔

R图重叠时间间隔,r,datetime,plot,R,Datetime,Plot,我有一张名单,上面有一天的工作开始和结束时间。我想画一条曲线,显示一天中任何一分钟工作的总人数。我所能做的就是为一天中的每分钟添加1440个额外的条件布尔变量,并将它们相加,但这似乎非常不雅观。我想知道是否有更好的方法(积分?) 下面是使用示例数据生成df的代码: sample_wt <- function() { require(lubridate) set.seed(10) worktime <- data.frame( ID

我有一张名单,上面有一天的工作开始和结束时间。我想画一条曲线,显示一天中任何一分钟工作的总人数。我所能做的就是为一天中的每分钟添加1440个额外的条件布尔变量,并将它们相加,但这似乎非常不雅观。我想知道是否有更好的方法(积分?)

下面是使用示例数据生成df的代码:

sample_wt <- function() {

    require(lubridate)

    set.seed(10)

    worktime <- data.frame(
            ID = c(1:100),
            start = now()+abs(rnorm(100,4800,2400))
            )

    worktime$end <- worktime$start + abs(rnorm(100,20000,10000))

    worktime$length <- difftime(worktime$end, worktime$start, units="mins")

    worktime
}

sample\u wt这里有一个选项,使用Bioconductor的
IRanges

library(IRanges)
## generate sample
DF <- sample_wt()
## create the range from the sample data
rangesA <- IRanges(as.numeric(DF$start), as.numeric(DF$end))
## create one minute range 
xx = seq(min(DF$start),max(DF$end),60)
rangesB <- IRanges(as.numeric(xx),as.numeric(xx+60))
## count the overlaps
ov <- countOverlaps(rangesB, rangesA, type="within")
## plot the result
plot(xx,ov,type='l')
库(IRanges)
##生成样本

DF当然可以改进,但这似乎可以做到:

time_range <- seq(min(DF$start), max(DF$end), 60)
result <- integer(length(time_range))
for (t in seq_along(time_range)) {
  result[t] <- sum(DF$start <= time_range[t] & DF$end >= time_range[t])
}

time\u range我没有安装
lubridate
,所以我通过
Sys.time
生成了data.frame,而不是现在的
(估计它们应该是类似的)。这可能会产生以下效果:

    minutes<-seq(as.POSIXct(paste(sep="",Sys.Date()," 00:00:00")),by="min",length.out=24*60)
    rowSums(outer(minutes,worktime$start,">") & outer(minutes,worktime$end,"<"))

minutes它不是样本数据,它是一个函数。@Pascal是的,一个可以用来创建样本数据的函数。@agstudy OP没有提供使用它的方法。这可能是重复的。我认为第三行代码中有错误,应该是:
rangesA我找不到
sample\u wt
函数。是哪个包裹的?很好的一个!我喜欢它胜过我的,而且
microbenchmark
说它们同样快。只需修剪向量两端额外的
0
s,它就完美了。您能演示如何使用这些代码绘制绘图吗?
plot(result)
?我使用自己的数据使用这些代码。但这段代码并没有画出一条直线图,将重叠时间相加,并显示有重叠的ppl的实际数量。你能用这个代码来做吗?
绘图(结果,type=“l”)
?上面的代码(请注意,nicola的答案比我的好)每60秒对经过的时间进行一次采样,计算在每个时间点之前开始但尚未结束的时间间隔数(即,
DF
data.frame
)。结果是计数向量,包含每个时间点的活动用户数。有关打印选项,请检查
?打印
    minutes<-seq(as.POSIXct(paste(sep="",Sys.Date()," 00:00:00")),by="min",length.out=24*60)
    rowSums(outer(minutes,worktime$start,">") & outer(minutes,worktime$end,"<"))