2016-09-22 6 views
1

2つの次元(緯度/経度)の単純な行列である2つのデータフレームがあります。両方のデータフレームは以下のようになります。2つの別々の行列で最も近い座標の隣を見つけて、2とrとの間の距離を

latitude longitude 
27.78833 -82.28197 
27.79667 -82.29294 

「dfref」と「dfnew」としましょう。 dfrefの各点について最も近い点をdfnewに、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))) 

効率的に、これをどのようにして1つのスクリプトにすることができる機能はありますか?

答えて

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 
+0

おかげBulatは、しかし、私は正しく私の問題を説明しなかったと思います。 私はdfrefのすべての点の距離と、dfnewのすべての点とdfnewのすべての点ではなく、dfnewの最も近い点のみを見つけようとしています。すべてのポイントを見つけようとすると、メモリ割り当てに関する問題が発生しました。 '1:fordervで(byval、sort = FALSE、retGrp = TRUE): 合計割り当てが8125Mbに達しました:help(memory.size)を参照してください。 – ericbrownaustin

+0

まず、すべてのポイントまでの距離を計算して、ポイント? – Bulat

+0

K Nearest Neighbors関数を使用して最も近い点を見つけることができるので、実際の距離を見つける前に最も近い点だけが返されます。私は私の元の質問に1つを使用しようとしていますが、結果をあまり理解していませんでした。私の前のコメントで述べたように、各点の距離を求めることはやや集中的です。私のデータフレームはそれぞれ10kと15k行で、効率的な方法を見つける必要があります。 – ericbrownaustin

関連する問題