如何过滤开始日期和结束日期位于 R 中两个日期之间的情况

问题描述 投票:0回答:1

想象这个数据集。

library(tidyverse)
library(lubridate)

df <- data.frame(
  ID = 1:10,
  start_date_smoking = c("28/06/2011", "27/07/2012", "09/04/2003", "01/07/2013", "28/06/2011",
                         "01/09/2013", "01/09/2013", "30/08/2014", "01/09/2013", "01/09/2013"),
  end_date_smoking = c("01/01/2017", "01/01/2017", "01/01/2017", "01/01/2017", "01/09/2013",
                       "01/09/2013", "02/09/2013", "01/01/2017", "31/08/2014", "31/08/2014")
)

df <- df %>% 
  mutate(
    start_date_smoking =dmy(start_date_smoking),
    end_date_smoking =  dmy(end_date_smoking),
    days = time_length(difftime(end_date_smoking, start_date_smoking),"days"))
  )

如何捕获在 2013 年 9 月 1 日至 2014 年 8 月 31 日期间吸烟且吸烟至少 180 天的吸烟者/病例 (ID)。我尝试了 filter() 但无法让它工作。例如,我想捕获在 2013 年 1 月 9 日之前开始吸烟的人(例如 ID 1),因为他们在这两个日期之间吸烟。但是,我不想捕获在 2014 年 8 月 30 日开始吸烟的人(例如,ID 8),即使他们吸烟了几年,因为在 2013 年 9 月 1 日和 31 日内,他不会在 180 天内吸烟。 -08-2014 时间表。

最终,我希望它返回一个过滤为 ID 1、2、3、4、9 和 10 的 df。

我尝试这样做,但它没有过滤到我期望的行

start_range <- dmy("01/09/2013")
end_range <- dmy("31/08/2014")

df %>%
  filter(days >= 180 &
         (start_date_smoking >= start_range & start_date_smoking <= end_range) |
           (end_date_smoking >= start_range & end_date_smoking <= end_range) |
           (start_date_smoking <= start_range & end_date_smoking >= end_range))
r dplyr lubridate
1个回答
0
投票
df %>% filter(days >= 180 & 
                start_date_smoking <=  as.Date("2013-09-01") &
                end_date_smoking >= as.Date("2014-08-31")
)
© www.soinside.com 2019 - 2024. All rights reserved.