R 中 data.frame 中的日期重叠

Dateoverlap in data.frame in R

我正在尝试根据日期重叠在我的数据框中创建一个新变量。

我的data看起来像这样

         People   Company  Start      End
1        Person1  CompanyA 2017-04-27 2019-12-31
2        Person2  CompanyB 2017-04-27 2019-08-30
3        Person3  CompanyA 2013-04-27 2019-12-31
4        Person4  CompanyB 2017-04-27 2019-12-31
5        Person5  CompanyC 2016-05-13 2019-12-31

我想查一下每个人是否都在公司里dates

    2016-12-31
    2017-12-31
    2018-12-31
    2019-12-31
...

我正在使用 DescTools 库中的 %overlaps%。如果我只检查 data

中的一行
c(data$Start[1], data$End[1]) %overlaps% dates[1]

它 returns TRUE (或 FALSE 在其他情况下)如我所料。但我想知道每一行的这一点并保存在我的变量 data$y2017data$y2018data$y2019 等中。但我对此有麻烦。

因为如果我只是尝试在每一行上执行此操作,它就不起作用,并且每一行仅 returns NA。例如,如果我尝试查看 2016-12-31:

中的人
data$y2016 <- c(data$Start, data$End) %overlaps% dates[1]

我该怎么做?

这是一个data.table方法

此解决方案的核心是 data.table::foverlaps()-函数,用于检查 DT.dates 中的开始-结束间隔 data.table 是否在 [=14= 中的开始-结束间隔内].

library(data.table)
# Sample data
DT <- fread("         People   Company  Start      End
        Person1  CompanyA 2017-04-27 2019-12-31
        Person2  CompanyB 2017-04-27 2019-08-30
        Person3  CompanyA 2013-04-27 2019-12-31
        Person4  CompanyB 2017-04-27 2019-12-31
        Person5  CompanyC 2016-05-13 2019-12-31")
DT[, Start := as.Date(Start)]
DT[, End := as.Date(End)]
DT.dates <- data.table( Start = as.Date(c("2016-12-31","2017-12-31","2018-12-31","2019-12-31")),
                        End   = as.Date(c("2016-12-31","2017-12-31","2018-12-31","2019-12-31")))

# Set keys
setkey(DT, Start, End)
setkey(DT.dates, Start, End)
# Perform overlapjoin and cast to wide
dcast(foverlaps(DT.dates, DT), People + Company + Start + End ~ i.Start, 
      value.var = "i.Start", fun.aggregate = length)
#     People  Company      Start        End 2016-12-31 2017-12-31 2018-12-31 2019-12-31
# 1: Person1 CompanyA 2017-04-27 2019-12-31          0          1          1          1
# 2: Person2 CompanyB 2017-04-27 2019-08-30          0          1          1          0
# 3: Person3 CompanyA 2013-04-27 2019-12-31          1          1          1          1
# 4: Person4 CompanyB 2017-04-27 2019-12-31          0          1          1          1
# 5: Person5 CompanyC 2016-05-13 2019-12-31          1          1          1          1