将一个数据集中的POSIXct与另一个数据集

时间:2017-12-13 10:12:53

标签: r

我试图将在一个数据集(检测)中找到的时间(在POSIXct中)与另一个数据集(GPS)中的数据(在POSIXct中)数据进行匹配;然后将第二个数据集中找到的GPS坐标复制到第一个数据集中的相关位置。

我有两个数据集:一个包含检测数据,另一个包含GPS坐标和到达/离开时间。

检测数据的示例:

Time                   Receiver    Transmitter    Latitude    Longitude
2015-10-29 14:17:31    Boat        A69-25863      NA          NA
2015-10-29 14:23:49    Boat        A69-25863      NA          NA
2015-10-29 14:25:49    Boat        A69-25863      NA          NA
2015-11-22 14:38:57    Boat        A69-25864      NA          NA
2015-11-22 14:40:06    Boat        A69-25864      NA          NA
(5429 entries)

时间是POSIXct格式,发射器是因素。

GPS数据示例:

ArrivalLocation  ArrivalTime           ArrivalLon   ArrivalLat  DepartureTime   
Saint Blaize     2015-10-29 12:19:08   22.14484     -34.17841   2015-10-29 14:38:29
Pansy Beach      2015-10-29 15:04:17   22.12347     -34.16677   2015-10-29 15:27:45
Santosstrand     2015-10-29 15:44:23   22.13361     -34.16975   2015-10-29 16:14:40
Santosstrand     2015-10-29 16:29:32   22.13642     -34.17137   2015-10-29 16:58:39
Seal Island      2015-11-22 13:49:30   22.12081     -34.14991   2015-11-22 18:25:05
Saint Blaize     2015-11-22 18:40:19   22.14519     -34.17847   2015-11-25 09:07:18
(669 entries)

ArrivalTime和DepartureTime都是POSIXct格式。

现在我想将第二个数据集中的GPS坐标复制到第一个数据集中的相关位置。

实施例: 2015-10-29 14:17:31处的第一次检测属于第一个GPS坐标的范围:Saint Blaize 2015-10-29 12:19:082015-10-29 14:38:29。然后应将坐标-34.1784122.14484复制到检测数据集中的相关单元格中:

Time                   Receiver    Transmitter    Latitude    Longitude
2015-10-29 14:17:31    Boat        A69-25863      -34.17841   22.14484

考虑到我有超过5400个条目(并且正在增长),如果手动完成,这将是一件苦差事。

我尝试使用ifelse()match()if(){}功能,但无济于事。

Detection$Latitude <- ifelse(Detection$Time >= GPS$ArrivalTime & Detection$Time <= GPS$DepartureTime, GPS$ArrivalLat, Detection$Latitude) 
Detection$Latitude <- GPS[match(Detection$Time >= GPS$ArrivalTime & Detection$Time <= GPS$DepartureTime), "ArrivalLat"]

我怀疑指定范围的方式存在问题,但这可能不是最大的错误。

(这是我关于堆栈溢出的第一篇帖子/问题,所以如果事情不够清楚我会道歉。)

1 个答案:

答案 0 :(得分:0)

这是一个有效的解决方案。因为您正在将一个向量与另一个向量中的所有值进行比较,所以我使用简单的循环。由于您的gps数据帧少于1000个条目,因此性能不应该太差。我相信应该有一个更有效的方法。

我使用了between包中的dplyr函数 假设您的数据帧名为“detection”和“gps”,时间列为POSIXct格式:

library(dplyr)
for (i in 1:length(gps$ArrivalTime)){
  isbewteen<-between(detection$Time, gps$ArrivalTime[i], gps$DepartureTime[i])
  detection$Latitude[isbewteen ]<-gps$ArrivalLat[i]
  detection$Longitude[isbewteen ]<-gps$ArrivalLon[i]
}