我有两个数据框,一个带有我的船 GPS 位置(5512 条记录),一个带有渔船位置(35381 条记录)。我想计算我的船与当天同一时间(到分钟)在该地区的所有其他渔船之间的距离。
我为所有位置创建了一个 IDdatecode (yyyymmddhhmm),然后基于相同的 IDdatecode 合并了两个数据帧。我这样做了:
merged_table<- merge(myboat,fishboats,by="IDdatecode",all.y=TRUE)
为了计算距离,我使用了以下公式:
merged_table$distance_between_vessels=distm(c("lon1","lat1"),c("lon2","lat2"),fun=distGeo)
其中 lon1, lat1 是我的船位, lon2, lat2 是渔船。
但我收到以下错误:
Error in `$<-.data.frame`(`*tmp*`, "distance_between_vessels", value = NA_real_) :
replacement has 1 row, data has 35652
In addition: Warning messages:
1: In .pointsToMatrix(x) : NAs introduced by coercion
2: In .pointsToMatrix(y) : NAs introduced by coercion
到目前为止我尝试的是:
- 使用这个其他公式:merged_table$distance_between_vessels=distGeo(c("lon1","lat1"),c("lon2","lat2"))
- 把纬度和经度的所有列“as.numeric”
- 仅使用我的船和渔船都在场的间隔时间
- 忽略警告并继续前进
但我仍然只得到一个 NA 列表。
我在一个更简单的数据集(仅我的船位置)中使用了函数“distGeo”,在该数据集中我手动计算了第一点和第二点之间的距离,然后是第二点和第三点之间的距离,依此类推。该功能完美运行,因为它为我提供了两点之间的正确距离(我在 ArcGIS 上检查过)。这就是我所做的:
distGeo(mydata[1, ], mydata[2, ])
distGeo(mydata[2, ], mydata[3, ])
distGeo(mydata[3, ], mydata[4, ])
因此,我想根据一天中的唯一时间计算“一对多”距离,但出现上述错误。关于为什么的任何想法?谢谢 :)
在这里,我合并表的前 10 行:
structure(list(Record = 1:10, IDdatecode = structure(c(1L, 2L,
3L, 3L, 4L, 4L, 5L, 5L, 6L, 6L), .Label = c("d201805081203",
"d201805081204", "d201805081205", "d201805081206", "d201805081207",
"d201805081208"), class = "factor"), lon1 = c(12.40203333, 12.4071,
12.41165, 12.41165, 12.41485, 12.41485, 12.41663333, 12.41663333,
12.41841667, 12.41841667), lat1 = c(45.1067, 45.10921667, 45.11218333,
45.11218333, 45.11303333, 45.11303333, 45.11313333, 45.11313333,
45.11348333, 45.11348333), boat1 = structure(c(1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L), .Label = "RB", class = "factor"), lon2 = c(13.02718,
13.02585827, 13.02453654, 13.02173, 13.02321482, 13.02052301,
13.02189309, 13.01931602, 13.02057136, 13.01810904), lat2 = c(44.98946,
44.99031749, 44.99117498, 44.98792, 44.99203246, 44.98868065,
44.99288995, 44.98944129, 44.99374744, 44.99020194), boat2 = structure(c(1L,
1L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), .Label = c("IMPERO II",
"MISTRAL"), class = "factor")), .Names = c("Record", "IDdatecode",
"lon1", "lat1", "boat1", "lon2", "lat2", "boat2"), row.names = c(NA,
-10L), class = "data.frame")