【问题标题】:Dateoverlap in data.frame in RR中data.frame中的日期重叠
【发布时间】:2021-04-29 09:56:26
【问题描述】:

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

我的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]

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

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

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

我该怎么做?

【问题讨论】:

    标签: r date overlap


    【解决方案1】:

    这是data.table 方法

    这个解决方案的核心是data.table::foverlaps()-函数来检查DT.dates data.table 中的Start-End 区间是否在DT 中的Start-End 区间内。

    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
    

    【讨论】:

    • 我遵循了您的代码,但是当我运行“setkey(DT, Start, End)”时,它会将某些日期(例如 2017-04-27)替换为 NA。
    • 没关系,这是我的错误。谢谢你的帮助。它有效!
    猜你喜欢
    • 2018-12-26
    • 2014-05-22
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多