【问题标题】:Check if dates are within a time frame r检查日期是否在时间范围内
【发布时间】:2021-05-25 12:46:16
【问题描述】:

我有两个数据集,一个具有不同 ID 在特定时间点的值,另一个具有多个时间范围的 ID。现在我想检查数据帧一中的时间点是否在数据集 2 中与 ID 匹配的任何时间帧内。 例如:

df1:

ID  date           time
1   2020-04-14   11:00:00
1   2020-04-14   18:00:00
1   2020-04-15   10:00:00
1   2020-04-15   20:00:00
1   2020-04-16   11:00:00
1   ...
2   ...

df2:

ID  start                  end
1  2020-04-14  16:00:00  2020-04-14 20:00:00
1  2020-04-15  18:00:00  2020-04-16 13:00:00
2  ...
2

我想要什么 df1_new:

ID  date           time      mark
1   2020-04-14   11:00:00   0
1   2020-04-14   18:00:00   1
1   2020-04-15   10:00:00   0
1   2020-04-15   20:00:00   1
1   2020-04-16   11:00:00   1
1   ...
2   ...

任何帮助将不胜感激!

【问题讨论】:

    标签: r time


    【解决方案1】:

    一个选项可能是:

    library(tidyverse)
    library(lubridate)
     
    #>     date, intersect, setdiff, union
    df_1 <- structure(list(ID = c(1L, 1L, 1L, 1L, 1L), date = c("14.04.2020", 
                                                                "14.04.2020", "15.04.2020", "15.04.2020", "16.04.2020"), time = c("11:00:00", 
                                                                                                                                  "18:00:00", "10:00:00", "20:00:00", "11:00:00"), date_time = structure(c(1586862000, 
                                                                                                                                                                                                           1586887200, 1586944800, 1586980800, 1587034800), class = c("POSIXct", 
                                                                                                                                                                                                                                                                      "POSIXt"), tzone = "UTC")), class = "data.frame", row.names = c(NA, 
                                                                                                                                                                                                                                                                                                                                      -5L))
    df_2 <- structure(list(ID = c(1L, 1L), start = c("14.04.2020 16:00", 
                                                     "15.04.2020 18:00"), end = c("14.04.2020 20:00", "16.04.2020 13:00"
                                                     )), class = "data.frame", row.names = c(NA, -2L))
    
    
    df_22 <- df_2 %>% 
      mutate(across(c("start", "end"), dmy_hm)) %>% 
      group_nest(ID)  
    
    left_join(x = df_1, y = df_22, by = "ID") %>% 
      as_tibble() %>% 
      mutate(mark = map2_dbl(date_time, data, ~+any(.x %within% interval(.y$start, .y$end)))) %>% 
      select(-data)
    #> # A tibble: 5 x 5
    #>      ID date       time     date_time            mark
    #>   <int> <chr>      <chr>    <dttm>              <dbl>
    #> 1     1 14.04.2020 11:00:00 2020-04-14 11:00:00     0
    #> 2     1 14.04.2020 18:00:00 2020-04-14 18:00:00     1
    #> 3     1 15.04.2020 10:00:00 2020-04-15 10:00:00     0
    #> 4     1 15.04.2020 20:00:00 2020-04-15 20:00:00     1
    #> 5     1 16.04.2020 11:00:00 2020-04-16 11:00:00     1
    

    reprex package (v2.0.0) 于 2021-05-25 创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 1970-01-01
      • 2017-06-20
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      相关资源
      最近更新 更多