所以我有这样一个数据框
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/