正在进行的事件的密度来自开始时间的密度

density of ongoing events from density of starting time

我有一个数据框,其中包含一列事件 A 的开始时间和事件 A 的时长(以小时为单位),如下所示:

df = structure(list(StartTime = c(10.1401724605821, 8.34114734060131, 
10.1930766354781, 9.49644518946297, 9.36002452136017, 10.8311833878979, 
9.44229844841175, 8.48090101312846, 9.31779155065306, 9.57179348240606
), Length = c(3.28013235144317, 3.97817114274949, 4.29317499510944, 
2.63135516550392, 3.49188423063606, 4.08827690966427, 3.63062007538974, 
3.82309223059565, 1.52407871372998, 1.80725628975779)), row.names = c(NA, 
-10L), class = c("tbl_df", "tbl", "data.frame"))

实际上,df 包含数千条记录。 我想计算 ongoing 事件数量的密度(或直方图 - 但密度更有意义,因为在每个时间增量中都有许多事件)。 因此,例如,在 8.02 开始并持续 1 小时的事件中,此记录会在 8.03、8.04...9.02 计算一次正在进行的操作。每条记录同样贡献多次

解决这个问题的最佳方法是什么?

这是一个 tidyverse 解决方案:

library(dplyr)
library(tidyr)
library(ggplot2)

df %>% 
  mutate(end = StartTime + Length) %>% 
  pivot_longer(c("StartTime", "end")) %>%
  arrange(value) %>%
  mutate(active = cumsum(2 * (name == "StartTime") - 1)) %>%
  ggplot(aes(value, active)) +
  geom_step() +
  labs(x = "time", y = "count")

reprex package (v0.3.0)

于 2020-10-16 创建