【问题标题】:R - plot overlapping time intervalsR - 绘制重叠时间间隔
【发布时间】:2014-09-12 17:58:31
【问题描述】:

我有一份人员名单以及他们一天中的工作开始和结束时间。我想绘制一条曲线,显示一天中任何给定分钟内工作的总人数。我能做的只是为一天中的每一分钟添加 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
}

要创建示例数据,您可以执行以下操作:

DF <- sample_wt() 

【问题讨论】:

  • 不是样本数据,是函数。
  • @Pascal yes ,一个可以用来创建大量数据的函数。
  • @agstudy OP 没有提供使用它的方法。

标签: r datetime plot


【解决方案1】:

这里有一个选项使用来自 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')

【讨论】:

  • 我认为第三行代码有错误,应该是:rangesA &lt;- IRanges(as.numeric(DF$start), as.numeric(DF$end)) (DF而不是rangeA)
  • 我找不到sample_wt 函数。它来自哪个包?
【解决方案2】:

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

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])
}

【讨论】:

  • 能否请您展示如何使用此代码绘制绘图?
  • plot(result)?
  • 我通过使用我自己的数据来使用此代码。但是这段代码没有绘制线图,将重叠时间相加并显示具有这些重叠的实际人数。你能用这段代码来做吗?
  • plot(result, type = "l") ?上面的代码(请注意,nicola 的答案比我的好)每 60 秒对经过的时间进行一次采样,计算在每个时间点之前开始但有还没有结束。结果是一个计数向量,包含每个时间点的活跃用户数。请查看?plot 了解绘图选项。
【解决方案3】:

我没有安装lubridate,所以我通过Sys.time而不是now生成了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,"<"))

【讨论】:

  • 不错的一个!我喜欢它胜过喜欢我的,microbenchmark 说它们同样快。只需在向量的每一端修剪额外的0s,就很完美了。
猜你喜欢
  • 2019-08-12
  • 2017-06-09
  • 1970-01-01
  • 2015-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-03
相关资源
最近更新 更多