首页 > 解决方案 > 如果日期介于第二个数据帧中的两个日期之间,则 r 标记第一个数据帧中的行

问题描述

我有两个数据集。第一个数据集对于每个 ID 都有两个日期列(开始、停止)。有时它可以包含每个 ID 的多个开始-停止日期。

数据集1

  Id    Code    Start        Stop
  431   279     2017-11-15   2019-08-15
  431   578     2019-09-15   2021-01-15
  832   590     2008-04-15   2020-05-15
  832   519     2020-06-15   2021-04-15

第二个数据集有 Id 和每个 ID 的许多时间戳行,如下所示

  Id   Weight   Date
  431  12.23    2018
  832  15.12    2020
  832   6.78    2020
  832   4.27    2007

我的目标是创建一个列InBetween,如果第二个数据集中的行在第一个数据集中的两个日期之间,则创建一个列,如果第二个数据集中的行不在第一个数据集中的两个日期之间,则创建一个指示“否”的列,其他像这样来自第一个数据集的列。

    Id   Weight   Date   Between  Code  Start        Stop
    431  12.23    2018   Yes      279   2017-11-15   2019-08-15  
    832  15.12    2020   Yes      590   2008-04-15   2020-05-15
    832   6.78    2020   Yes      590   2008-04-15   2020-05-15
    832   4.27    2007   No       NA    NA           NA

我可以使用 for 循环来做到这一点,但我更喜欢使用 dplyr、innerjoin 或其他没有 forloops 的选项的任何解决方案。提前致谢。

标签: rdatedplyrgroupinginner-join

解决方案


很乱,但你可以试试

df2 %>%
  full_join(df1, by = "Id") %>%
  mutate(Date = as.Date(ISOdate(Date,1,1)),
         Start = as.Date(Start),
         Stop = as.Date(Stop)) %>%
  rowwise %>%
  mutate(Between = between(Date, Start, Stop)) %>%
  group_by(Id, Date) %>%
  mutate(check = any(Between)) %>%
  filter(!(Between == FALSE& check == TRUE)) %>%
  mutate(Start = ifelse(check, Start, NA), 
         Stop = ifelse(check, Stop, NA),
         Code = ifelse(check, Code, NA)) %>%
  distinct() %>% select(-check)


     Id Weight Date        Code Start  Stop Between
  <int>  <dbl> <date>     <int> <dbl> <dbl> <lgl>  
1   431  12.2  2018-01-01   279 17485 18123 TRUE   
2   832  15.1  2020-01-01   590 13984 18397 TRUE   
3   832   6.78 2020-01-01   590 13984 18397 TRUE   
4   832   4.27 2007-01-01    NA    NA    NA FALSE

推荐阅读