R 如何按天计算时间间隔:给定的一天包含多少个时间间隔?

R 如何按天计算时间间隔:给定的一天包含多少个时间间隔?,r,lubridate,R,Lubridate,我有一个非常大的时间间隔数据集(开始日期和结束日期值),需要计算这些日期整个范围内的每一天有多少时间间隔包含日期 本质上,我想知道每天有多少人在监狱里。我知道他们什么时候进来,什么时候离开。我需要能够确定多年来每天有多少人在监狱里 示例数据: require(tidyverse) 要求(润滑) x#A tibble:3x3 #>起始结束数据点 #> #>1 2019-10-13 2019-10-15 2019-10-13 UTC-

我有一个非常大的时间间隔数据集(开始日期和结束日期值),需要计算这些日期整个范围内的每一天有多少时间间隔包含日期

本质上,我想知道每天有多少人在监狱里。我知道他们什么时候进来,什么时候离开。我需要能够确定多年来每天有多少人在监狱里

示例数据:

require(tidyverse)
要求(润滑)
x#A tibble:3x3
#>起始结束数据点
#>                                 
#>1 2019-10-13 2019-10-15 2019-10-13 UTC--2019-10-15 UTC
#>2019-10-14 2019-10-16 2019-10-14 UTC--2019-10-16 UTC
#>3 2019-10-15 2019-10-17 2019-10-15 UTC--2019-10-17 UTC
mydays%enframe(name=NULL,value=“eachday”)
mydays
#>#tible:5 x 1
#>每天
#>       
#> 1 2019-10-13
#> 2 2019-10-14
#> 3 2019-10-15
#> 4 2019-10-16
#> 5 2019-10-17
#预期结果:
mydays%>%add_列(预期结果=c(1,2,3,2,1))
#>#tibble:5 x 2
#>每一天的预期结果
#>                  
#> 1 2019-10-13               1
#> 2 2019-10-14               2
#> 3 2019-10-15               3
#> 4 2019-10-16               2
#> 5 2019-10-17               1
由(v0.3.0)于2019年10月18日创建

我还需要能够在分组的TIBLES上执行此操作,这样我就可以根据人口统计属性计算总数


在tidyverse/lubridate中是否有一种有效的方法

一个涉及
dplyr
tidyr
lubridate
的选项可以是:

x %>%
 mutate(eachday = list(seq.Date(min(start), max(end), by = "1 day"))) %>%
 unnest(eachday) %>%
 group_by(eachday) %>%
 summarise(overlap = sum(int_overlaps(dtint, interval(eachday, eachday))))

  eachday    overlap
  <date>       <int>
1 2019-10-13       1
2 2019-10-14       2
3 2019-10-15       3
4 2019-10-16       2
5 2019-10-17       1
x%>%
突变(每个日期=列表(顺序日期(最小(开始),最大(结束),按=“1天”))%>%
最新(每天)%%>%
分组人(每天)%>%
总结(重叠=总和(整数重叠(dtint,间隔(eachday,eachday)))
每天重叠
1 2019-10-13       1
2 2019-10-14       2
3 2019-10-15       3
4 2019-10-16       2
5 2019-10-17       1

首先,它创建数据中第一个日期和最后一个日期之间的日期列表,并取消对其的显示。然后,它按日期分组,并对dtint间隔和日期间隔之间的重叠进行求和。

一个涉及
dplyr
tidyr
lubridate
的选项可以是:

x %>%
 mutate(eachday = list(seq.Date(min(start), max(end), by = "1 day"))) %>%
 unnest(eachday) %>%
 group_by(eachday) %>%
 summarise(overlap = sum(int_overlaps(dtint, interval(eachday, eachday))))

  eachday    overlap
  <date>       <int>
1 2019-10-13       1
2 2019-10-14       2
3 2019-10-15       3
4 2019-10-16       2
5 2019-10-17       1
x%>%
突变(每个日期=列表(顺序日期(最小(开始),最大(结束),按=“1天”))%>%
最新(每天)%%>%
分组人(每天)%>%
总结(重叠=总和(整数重叠(dtint,间隔(eachday,eachday)))
每天重叠
1 2019-10-13       1
2 2019-10-14       2
3 2019-10-15       3
4 2019-10-16       2
5 2019-10-17       1

首先,它创建数据中第一个日期和最后一个日期之间的日期列表,并取消对其的显示。然后,它按日期分组,并对dtint间隔和日期间隔之间的重叠进行求和。

下面是一种方法,可以使用每个分组的人口统计中的累积计数来跟踪总数

# Example data
library(tidyverse)
set.seed(42)
x <- tibble(demographic = sample(LETTERS[1:3], 100, replace = T),
            start = as.Date("2019-01-01") + runif(100, 0, 30),
            end = start + runif(100, 1, 50))
## A tibble: 6 x 3
#  demographic start      end       
#  <chr>       <date>     <date>    
#1 C           2019-01-19 2019-03-05
#2 C           2019-01-07 2019-02-02
#3 A           2019-01-07 2019-02-19
#4 C           2019-01-12 2019-02-04
#5 B           2019-01-29 2019-02-07
#6 B           2019-01-29 2019-02-21

以下是一种方法,您可以使用每个分组人口的累积计数来跟踪总数

# Example data
library(tidyverse)
set.seed(42)
x <- tibble(demographic = sample(LETTERS[1:3], 100, replace = T),
            start = as.Date("2019-01-01") + runif(100, 0, 30),
            end = start + runif(100, 1, 50))
## A tibble: 6 x 3
#  demographic start      end       
#  <chr>       <date>     <date>    
#1 C           2019-01-19 2019-03-05
#2 C           2019-01-07 2019-02-02
#3 A           2019-01-07 2019-02-19
#4 C           2019-01-12 2019-02-04
#5 B           2019-01-29 2019-02-07
#6 B           2019-01-29 2019-02-21

这里有一个带有
数据的选项。表
。将“data.frame”转换为“data.table”(
setDT
0,从“start”的
min
和“end”的
max
创建
seq
列,然后使用非等联接与原始数据集联接并获取计数(
.N

库(data.table)
setDT(x)[x[,(每一天=序列(最小(开始),最大(结束),由='1天'))],
(eachday,overlap=.N),on=(start=eachday),by=.EACHI][,(eachday,overlap)]
#每天重叠
#1: 2019-10-13       1
#2: 2019-10-14       2
#3: 2019-10-15       3
#4: 2019-10-16       2
#5: 2019-10-17       1

这里有一个带有
data.table
的选项。将'data.frame'转换为'data.table'(
setDT
0,从'start'的
min
和'end'的
max
创建
seq
列,然后使用非等联接与原始数据集联接并获取计数(
.N

库(data.table)
setDT(x)[x[,(每一天=序列(最小(开始),最大(结束),由='1天'))],
(eachday,overlap=.N),on=(start=eachday),by=.EACHI][,(eachday,overlap)]
#每天重叠
#1: 2019-10-13       1
#2: 2019-10-14       2
#3: 2019-10-15       3
#4: 2019-10-16       2
#5: 2019-10-17       1

谢谢。虽然这适用于小数据,但对于较大的数据(我有10年和数万个间隔要检查),它会扩展为一个巨大的TIBLE,需要运行很长时间。我明白了。我会考虑更快的可能性:)谢谢。而这适用于小数据,对于较大的数据(我有10年和数万个间隔要检查)它扩展为一个巨大的tibble,运行需要很长时间。我明白了。我会考虑更快的可能性:)