我有2个数据帧,它们只是2维的矩阵(纬度/经度)。两个数据框看起来都像下面的输入:
latitude longitude
27.78833 -82.28197
27.79667 -82.29294
我们称他们为“dfref”和“dfnew”。我想在dfnew
中为dfref
中的每个点找到最近的点,以及以米为单位的2点之间的距离。
输出如下:
dr.latitude dr.longitude dn.latitude dn.longitude dist
27.78833 -82.28197 27.54345 -82.33233 162.34
27.79667 -82.29294 27.56543 -82.12323 232.23
我已尝试在类包和Searchtrees包中使用knn函数,但我的脚本只找到了dfref矩阵中的最近点,我不知道如何添加测量值。
knn1(train=cbind(dfref), test=cbind(dfnew), cl=seq_len(nrow(dfnew)))
是否有一个功能可以有效地完成这两个脚本?
答案 0 :(得分:0)
我不是地理数学的专家,但似乎你可以从这样的事情开始:
dfref <- read.table(text =
"latitude longitude
27.78833 -82.28197
27.79667 -82.29294", header = T)
dtref <- data.table(dfref)
dfnew <- read.table(text =
"latitude longitude
27.54345 -82.33233", header = T)
dtnew <- data.table(dfnew)
# Make cartesian product of to tables.
dtref$fake <- 1
dtnew$fake <- 1
dtall <- merge(dtref, dtnew, by = "fake", allow.cartesian = T)
# Calculate distance.
library(geosphere)
dtall[, distance := distVincentyEllipsoid(c(longitude.x, latitude.x), c(longitude.y, latitude.y)), by = 1:nrow(dtall)]
# Print results.
dtall[, .(latitude.x, longitude.x, latitude.y, longitude.y, distance)]
# latitude.x longitude.x latitude.y longitude.y distance
# 1: 27.78833 -82.28197 27.54345 -82.33233 27587.29
# 2: 27.79667 -82.29294 27.54345 -82.33233 28328.19