r - 如何检查日期是否在 R 中的间隔列表内?

标签 r list date tidyr purrr

我有两个数据框(tibbles),每个数据框有 2 个变量:

  • df.POS:ID(ID变量);日期(实验室检测呈阳性的日期)
  • df.NEG:ID(ID变量);数据(阴性实验室测试的日期(超过 1 次测试)。

  • 请注意 data 是一个列表变量,使用 tidyr 包的 nest() 函数创建。
    library(tidyverse)
    library(lubridate)
    
    # negative tests
    dates.neg <- ymd(c('2018-02-01', '2018-02-06', '2018-02-10', 
                 '2018-02-21', '2018-04-05'))
    df.NEG <- tibble(ID = paste0('ID_', rep(1, 5)),
              DATE = dates.neg) %>%
           group_by(ID) %>% 
              nest()
    df.NEG
    
    ## # A tibble: 1 x 2
    ##   ID    data            
    ##   <chr> <list>          
    ## 1 ID_1  <tibble [5 × 1]>
    
    
    dates.pos <- ymd(c('2018-02-07', '2018-02-12', '2018-02-13', 
                 '2018-02-20', '2018-02-21', '2018-03-18'))
    
    df.POS <- tibble(ID = paste0('ID_', rep(1, 6)),
               DATE = dates.pos)
    df.POS
    
    ## # A tibble: 6 x 2
    ##   ID    DATE      
    ##   <chr> <date>    
    ## 1 ID_1  2018-02-07
    ## 2 ID_1  2018-02-12
    ## 3 ID_1  2018-02-13
    ## 4 ID_1  2018-02-20
    ## 5 ID_1  2018-02-21
    ## 6 ID_1  2018-03-18
    

    我想知道在阳性测试结果后最多 2 天内,哪些阳性测试也有阴性测试。我试过使用 purrr 包的 map2() 函数
    df.TOTAL <- df.POS %>%
      left_join(df.NEG, by = 'ID') %>%
        mutate(TIME = interval(DATE, DATE + days(2)),
               RESULT = map2(data, "DATE", TIME, ~ .x %within% .y)) 
    

    不幸的是,我的代码不起作用。 RESULT 变量应该是逻辑的,如果在阳性测试后最多 2 天出现阴性测试结果,则返回 TRUE。相反,它是一个列表并返回 NULL。
    df.TOTAL
    
    ## # A tibble: 6 x 5
    ##   ID    DATE       data             TIME                           RESULT
    ##   <chr> <date>     <list>           <S4: Interval>                 <list>
    ## 1 ID_1  2018-02-07 <tibble [5 × 1]> 2018-02-07 UTC--2018-02-09 UTC <NULL>
    ## 2 ID_1  2018-02-12 <tibble [5 × 1]> 2018-02-12 UTC--2018-02-14 UTC <NULL>
    ## 3 ID_1  2018-02-13 <tibble [5 × 1]> 2018-02-13 UTC--2018-02-15 UTC <NULL>
    ## 4 ID_1  2018-02-20 <tibble [5 × 1]> 2018-02-20 UTC--2018-02-22 UTC <NULL>
    ## 5 ID_1  2018-02-21 <tibble [5 × 1]> 2018-02-21 UTC--2018-02-23 UTC <NULL>
    ## 6 ID_1  2018-03-18 <tibble [5 × 1]> 2018-03-18 UTC--2018-03-20 UTC <NULL>
    

    任何人都可以帮忙吗?

    我会很感激一些帮助。首先十分感谢!

    最佳答案

    首先,请注意,您可以测试“负”日期向量中的任何元素是否落在“正”区间内,如下所示:

    any(dates.neg %within% interval(dates.pos[1], dates.pos[1] + days(2)))
    # [1] FALSE
    

    这建议使用以下方法 map2 -- 或更有用的是,map2_lgl :
    df.TOTAL <- df.POS %>%
      left_join(df.NEG, by = 'ID') %>%
        mutate(TIME = interval(DATE, DATE + days(2)),
               RESULT = map2_lgl(data, TIME, ~any(.x$DATE %within% .y)))
    # # A tibble: 6 x 5
    #   ID    DATE       data             TIME                           RESULT
    #   <chr> <date>     <list>           <S4: Interval>                 <lgl> 
    # 1 ID_1  2018-02-07 <tibble [5 x 1]> 2018-02-07 UTC--2018-02-09 UTC FALSE 
    # 2 ID_1  2018-02-12 <tibble [5 x 1]> 2018-02-12 UTC--2018-02-14 UTC FALSE 
    # 3 ID_1  2018-02-13 <tibble [5 x 1]> 2018-02-13 UTC--2018-02-15 UTC FALSE 
    # 4 ID_1  2018-02-20 <tibble [5 x 1]> 2018-02-20 UTC--2018-02-22 UTC TRUE  
    # 5 ID_1  2018-02-21 <tibble [5 x 1]> 2018-02-21 UTC--2018-02-23 UTC TRUE  
    # 6 ID_1  2018-03-18 <tibble [5 x 1]> 2018-03-18 UTC--2018-03-20 UTC FALSE 
    

    感谢@ubutun 改进答案。

    关于r - 如何检查日期是否在 R 中的间隔列表内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53460597/

    相关文章:

    r - 选择每隔 n 行的数据框并添加到 R 中的数据框列表

    r - 在特定条件下创建二进制矩阵

    python - 一旦从 python 列表中的列表中删除了一个项目,我如何刷新列表

    sql - 将文本转换为日期数据类型

    r - dplyr 根据具有不同后缀的其他列进行变异

    r - 是否可以将百分比添加到列联表中

    list - 在 Haskell 中过滤列表

    python - 如何将 infile 中数据的平均值写入 out 文件

    php - 用变量中的数字增加变量 + PHP

    windows - 比较 Windows 批处理文件中的 2 个日期