Как проверить, находится ли дата в списке интервалов в R?

У меня есть два фрейма данных (таблицы) с двумя переменными в каждом:

  • df.POS: ID (переменная ID); ДАТА (Дата положительного лабораторного теста)
  • df.NEG: ID (переменная ID); данные (дата отрицательных лабораторных тестов (более 1 теста).

Обратите внимание, что data - это переменная списка, созданная с помощью функции nest () пакета tidyr.

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 дня после положительного результата теста. Я пытался использовать функцию map2 () пакета purrr

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 должна быть логической и возвращать TRUE в случае отрицательного результата теста в течение 2 дней после положительного теста. Вместо этого это список и возвращает 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>

Кто-нибудь может помочь?

Буду признателен за помощь. Большое спасибо заранее!

4 голоса | спросил Norbert Köhler 24 62018vEurope/Moscow11bEurope/MoscowSat, 24 Nov 2018 20:18:42 +0300 2018, 20:18:42

1 ответ


0
Во-первых, обратите внимание, что вы можете проверить, попадает ли какой-либо элемент из вектора «отрицательных» дат в «положительный» интервал следующим образом:Это предполагает следующий подход с использованием ---- +: = 1 =: + ---- - или, что более полезно, ---- +: = 2 =: + ---- :Спасибо @ubutun за улучшение ответа.
ответил Weihuang Wong 24 62018vEurope/Moscow11bEurope/MoscowSat, 24 Nov 2018 22:15:05 +0300 2018, 22:15:05

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132