我试图将在一个数据集(检测)中找到的时间(在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:08
和2015-10-29 14:38:29
。然后应将坐标-34.17841
和22.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"]
我怀疑指定范围的方式存在问题,但这可能不是最大的错误。
(这是我关于堆栈溢出的第一篇帖子/问题,所以如果事情不够清楚我会道歉。)
答案 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]
}