在R测试中,如果案例在时间范围内且具有唯一ID

在R测试中,如果案例在时间范围内且具有唯一ID,r,date,range,R,Date,Range,我有两个带信息的数据帧 第一个是最大的,包含许多行,用于曲线中唯一的速度测量。所以它有一列带有curveID,一个测量日期时间,还有很多列带有其他速度和曲线信息 第二个是一个小型数据库,包含已知的道路工程。它包含三列:curveID、from和to。curveID与第一个数据库具有相同的系数,from是一个日期时间(POSIXct)是该路段道路工程的开始道路工程,to是一个包含道路工程结束的日期时间(POSIXct) 相当简化的数据库如下所示: speedmeasurements <- d

我有两个带信息的数据帧

第一个是最大的,包含许多行,用于曲线中唯一的速度测量。所以它有一列带有curveID,一个测量日期时间,还有很多列带有其他速度和曲线信息

第二个是一个小型数据库,包含已知的道路工程。它包含三列:curveID、from和to。curveID与第一个数据库具有相同的系数,from是一个日期时间(POSIXct)是该路段道路工程的开始道路工程,to是一个包含道路工程结束的日期时间(POSIXct)

相当简化的数据库如下所示:

speedmeasurements <- data.frame("curve_id" = c(1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3), "datetime" = c(0, 2, 8, 9, 1, 2, 3, 4, 5, 1, 3, 5))
roadworks <- data.frame("curve_id" = c(1, 1, 3), "from" = c(1, 5, 2), "to" = c(3, 7, 4))

speedmeasurements由于您希望使用by
curve\u id
进行操作,因此建议执行联接操作。不幸的是,基本R的
merge
dplyr
*\u join
函数不会产生不相等的结果,因此您只能通过
curve\u id
进行拆分,对每个函数进行一些手动操作,然后重新绑定它们

data.table
允许直接进行“等”联接(在一个范围内联接)

首先,我将在“道路工程”列中添加内容,以便我们从连接中看到一些东西

库(data.table)
setDT(速度测量)
环境运输及运输局局长(道路工程)
道路工程[,道路工程:=正确]
道路工程
#从公路到道路工程的曲线id
#1:13对
#2:15 7对
#3:324对
现在是合并:

roadworks[速度测量,on=(曲线id,from=日期时间)]
#从公路到道路工程的曲线id
#1:100 NA
#2:12对
#3:18 NA
#4:19 NA
#5:21 NA
#6:2 NA
#7:23 NA
#8:24NA
#9:25NA
#10:31 NA
#11:3对
#12:35 NA
这其中有几点:

  • data.table
    的合并前提是
    A[B,on=.(…)]
    实际上是“B左加入A”(参见和)
  • 它保留的是
    A
    中的联接列名,而不是
    B
    ,因此我们将要重命名它们
  • 那些不匹配的行将获得预期的
    NA
带清理的完整代码:

speed2%
[道路工程:=!is.na(道路工程)]

(请注意,
data.table
有一个长期存在的错误,如果最后一个操作是
:=
赋值,请参阅)

感谢您的冗长回答!但是
from=datetime
在POSIXct上工作得好吗?我在运行第一行后才得到na。我使用
感谢您的确认。我正在调查,但还没找到。也许是时区问题…我一直在关注日期时间,但我的错误是在曲线上。。。你的解决方案很有魅力!
speedmeasurements <- data.frame("curve_id" = c(1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3), "datetime" = c(0, 2, 8, 9, 1, 2, 3, 4, 5, 1, 3, 5), "roadworks" = c(F, T, F, F, F, F, F, F, F, F, T, F))