如何用R语言计算无重叠的单组活跃时间区间?
解决方案
要找出仅单个组活跃且无其他组时间重叠的时段,可以通过分割所有时间点→统计每个子区间的活跃组数→筛选单组活跃区间的思路实现,具体代码如下:
步骤1:加载依赖包
library(tidyverse) library(lubridate)
步骤2:提取并排序所有时间节点
把所有组的起始、结束时间提取出来,去重后排序,得到所有可能的区间分割点:
time_points <- data %>% pivot_longer(cols = c(start, end), values_to = "time") %>% pull(time) %>% unique() %>% sort()
步骤3:生成所有连续子区间
用排序后的时间点生成一系列连续的小时间区间:
time_intervals <- tibble( interval_start = time_points[-length(time_points)], interval_end = time_points[-1] )
步骤4:统计每个子区间的活跃组数并筛选
对每个子区间,判断哪些组的时间范围覆盖它,统计活跃组数后筛选出仅单个组活跃的区间:
single_group_intervals <- time_intervals %>% rowwise() %>% mutate( # 找出当前子区间内活跃的所有组 active_groups = list(data %>% filter(start < interval_end, end > interval_start) %>% pull(group)), group_count = length(active_groups) ) %>% ungroup() %>% # 仅保留单个组活跃的区间 filter(group_count == 1) %>% mutate(group = unlist(active_groups))
查看结果
格式化时间后输出结果:
single_group_intervals %>% select(group, interval_start, interval_end) %>% mutate( interval_start = format(interval_start, "%Y-%m-%d %H:%M:%S"), interval_end = format(interval_end, "%Y-%m-%d %H:%M:%S") )
输出结果:
# A tibble: 1 × 3 group interval_start interval_end <chr> <chr> <chr> 1 C 2022-01-03 14:00:00 2022-01-03 15:00:00
内容的提问来源于stack exchange,提问作者fschier
相关产品推荐
相关产品推荐

