![](/img/trans.png)
[英]Is there a way in r to check if each date of a list of dates is within a list of intervals?
[英]How to Check if a Date is Within a List of Intervals in R?
我有兩個數據幀(tibbles),每個數據幀有2個變量:
請注意,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提高答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.