r - 使用 dplyr 匹配两个数据帧中的时间戳

标签 r timestamp tidyverse dplyr

所以我有这样一个数据框

DF1

ID    timestamp              value
1     2018-07-31 20:00:00    45555
1     2018-08-01 06:50:00    333
1     2018-08-01 07:00:00    322
2     2018-08-01 13:00:00    1222
2     2018-08-01 22:00:00    1111
3     2018-08-01 11:00:00    0
3     2018-08-02 08:00:00    22222

还有一个是这样的

DF2

          startTime             endTime   ID    
2018-08-01 06:45:00 2018-08-01 09:49:00   1
2019-12-02 11:01:00 2019-12-02 11:02:00   2
2018-08-02 07:59:00 2018-08-02 08:50:00   2
2018-08-02 07:59:00 2018-08-02 08:50:00   3

所以我想使用 mutate 创建一个新列,它会改变 DF2 ,它会告诉我 startTime 之间是否有任何时间>endTime 出现在与 ID 匹配的 DF1 中。

所以在 DF2 中,如果我们有一个像 8/2/2018 这样的日期并且时间跨度是 7:59AM - 8:50AM ,如果包含这个时间间隔内的任何时间戳 (2018-08-02 7:59:00, 2018-08-02 8:00:00, 2018-08-02 8:01:00...) 出现在 DF1 然后是 DF2 读取 1,否则读取 0。只有当 ID 匹配时才会出现这种情况。多少次不重要,至少一次才是最重要的。

DF2 的最终版本应该是这样的。

          startTime             endTime   ID   match
2018-08-01 06:45:00 2018-08-01 09:49:00   1    1
2019-12-02 11:01:00 2019-12-02 11:02:00   2    0
2018-08-02 07:59:00 2018-08-02 08:50:00   2    0
2018-08-02 07:59:00 2018-08-02 08:50:00   3    1

理想情况下,我想使用 BETWEEN() 并留在 tidyverse 中。

最佳答案

我们可以在 DateTime 列和“ID”列上使用 data.table 非相等连接,通过检查行数 ( .N) 大于 0

library(data.table)
DF2$match <- 0L
setDT(DF2)[DF1,  match := +(.N > 0),on = .(ID, 
        startTime < timestamp, endTime > timestamp), by = .EACHI]
DF2
#             startTime             endTime ID match
#1: 2018-08-01 06:45:00 2018-08-01 09:49:00  1     1
#2: 2019-12-02 11:01:00 2019-12-02 11:02:00  2     0
#3: 2018-08-02 07:59:00 2018-08-02 08:50:00  2     0
#4: 2018-08-02 07:59:00 2018-08-02 08:50:00  3     1

数据

DF1 <- structure(list(ID = c(1L, 1L, 1L, 2L, 2L, 3L, 3L),
 timestamp = structure(c(1533085200, 
1533124200, 1533124800, 1533146400, 1533178800, 1533139200, 1533214800
), class = c("POSIXct", "POSIXt"), tzone = ""), value = c(45555L, 
333L, 322L, 1222L, 1111L, 0L, 22222L)), row.names = c(NA, -7L
), class = "data.frame")

DF2 <- structure(list(startTime = structure(c(1533123900, 1575306060, 
1533214740, 1533214740), class = c("POSIXct", "POSIXt"), tzone = ""), 
    endTime = structure(c(1533134940, 1575306120, 1533217800, 
    1533217800), class = c("POSIXct", "POSIXt"), tzone = ""), 
    ID = c(1L, 2L, 2L, 3L)), row.names = c(NA, -4L), class = "data.frame")

关于r - 使用 dplyr 匹配两个数据帧中的时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62684774/

相关文章:

使用变量标识符从 R 中的 excel 中读取数据

r - 从 1 个数据帧中的多个时间序列的开头和结尾有效地删除缺失值

mysql - 使用 HQL/SQL 查询以分钟为单位计算日期差异

java - 从字符串中获取时间戳而不是日期

r - 在 R 中将函数迭代应用到它自己的结果

html - 与 IncludeMarkdown 的 Shiny react ?

r - 当excel文件存在或工作表存在时如何在R中使用write.xlsx

java - Java中的时间同步

r - 多个型号: how to select best model and make prediction

r - 将 tidyverse %>% 管道与日期和格式() 一起使用;如何防止 gobbledygook 字符?