R 根据距离和时间选择值

R 根据距离和时间选择值,r,data.table,R,Data.table,我想根据以下空间和时间条件匹配两个表的值: 两小时时间间隔 最小距离,最大距离20公里 我可以使用for循环来解决这个问题,但是由于表的维度是300万*10万*13,所以需要很长时间才能完成 你有什么建议吗?我在下面贴了一个实际的例子和期望的输出。多谢各位 示例 DT1 <- data.table( Date = as.POSIXct(c("2005-01-05 10:40:00", "2005-01-06 10:40:00", "2005-01-07 10:40:00", "2005

我想根据以下空间和时间条件匹配两个表的值:

  • 两小时时间间隔
  • 最小距离,最大距离20公里
我可以使用for循环来解决这个问题,但是由于表的维度是300万*10万*13,所以需要很长时间才能完成

你有什么建议吗?我在下面贴了一个实际的例子和期望的输出。多谢各位

示例

DT1 <- data.table(
Date = as.POSIXct(c("2005-01-05 10:40:00", "2005-01-06 10:40:00", "2005-01-07 10:40:00", "2005-01-08 10:40:00", "2005-01-09 10:40:00", "2005-01-10 10:40:00"), format = "%Y-%m-%d %T", tz = "GMT"), 
Lat = c(rep(50, 3), 35.44, 25.44, 15.44), 
Lon = c(rep(-50, 3), -10.44, -20.44, -30.44), 
Other.col = sample(LETTERS, 6))

DT2 <- data.table(
Date = as.POSIXct(c("2011-01-01 10:40:00", "2005-01-05 11:40:00", "2005-01-09 08:59:00", "2005-01-09 09:18:00", "2005-01-10 08:59:00"), format = "%Y-%m-%d %T", tz = "GMT"), 
Lat = c(35.44, 1, 25.54, 25.43, 15.46), 
Lon = c(-10.44, 1, -20.66, -20.42, -30.13),
Quality = c("h", "f", "n", "z", "l"))

DT1
                  Date   Lat    Lon Other.col
1: 2005-01-05 10:40:00 50.00 -50.00         E
2: 2005-01-06 10:40:00 50.00 -50.00         C
3: 2005-01-07 10:40:00 50.00 -50.00         O
4: 2005-01-08 10:40:00 35.44 -10.44         Z
5: 2005-01-09 10:40:00 25.44 -20.44         T
6: 2005-01-10 10:40:00 15.44 -30.44         S

DT2
                  Date   Lat    Lon Quality
1: 2011-01-01 10:40:00 35.44 -10.44       h
2: 2005-01-05 11:40:00  1.00   1.00       f
3: 2005-01-09 08:59:00 25.54 -20.66       n
4: 2005-01-09 09:18:00 25.43 -20.42       z
5: 2005-01-10 08:59:00 15.46 -30.13       l

Output
                  Date   Lat    Lon Other.col V2
1: 2005-01-05 10:40:00 50.00 -50.00         E NA
2: 2005-01-06 10:40:00 50.00 -50.00         C NA
3: 2005-01-07 10:40:00 50.00 -50.00         O NA
4: 2005-01-08 10:40:00 35.44 -10.44         Z NA
5: 2005-01-09 10:40:00 25.44 -20.44         T  z
6: 2005-01-10 10:40:00 15.44 -30.44         S  l

DT1对于您的具体示例,您可以执行
DT1[DT2,V2:=i.Quality,on=c(Date=“Date”),roll=-2*60*60]
但我不太清楚“2小时”的间隔,它是否意味着两种方式?此外,距离部分将更加困难,因为你需要为每场比赛运行一个复杂的公式。我想你可以先解出2小时的时间间隔,然后用矢量化的方法在子集上运行公式。但就目前而言,你的例子似乎过于简化了。例如,如果
DT2
中的两个值满足
DT1
中相同值的条件,会发生什么情况?两个小时的间隔实际上是双向的。如果
DT2
中的两个值满足
DT1
中的条件,则选择最近的点。对于您的具体示例,您可以执行
DT1[DT2,V2:=i.Quality,on=c(Date=“Date”),roll=-2*60*60]
但我不太清楚“2小时”间隔,它是否意味着两种方式?此外,距离部分将更加困难,因为你需要为每场比赛运行一个复杂的公式。我想你可以先解出2小时的时间间隔,然后用矢量化的方法在子集上运行公式。但就目前而言,你的例子似乎过于简化了。例如,如果
DT2
中的两个值满足
DT1
中相同值的条件,会发生什么情况?两个小时的间隔实际上是双向的。如果
DT2
中的两个值满足
DT1
中的条件,则选择最近的点。