2016-07-07 23 views
2

私はUTM(Universal Transverse Mercator)座標系で場所とその地理的位置のリストを持つデータフレームを持っています。各点から所定の距離内にある点を見つけよう

Place X_UTM Y_UTM 
    1 574262.0 6140492 
    2 571251.2 6141669 
    3 570841.9 6142535 
    4 570233.8 6141213 
    5 578269.2 6140304 
    6 575067.1 6137444 

私が確認したい、他の場所についてユークリッド距離内にある各場所(データフレームの各行)、用:

それは次のようになります。この場合、私は1キロメートル以上の場所を探しています。私はこのような何かを試してみた

:千メートルより近い点を返す関数であるべき

foo <- function(x, y) dist(c(x, y), method = "euclidian") < 1000 

。その後:

x <- lapply(df(,c(i, x, y)), FUN = foo) 
i"Place"ある

x"X_UTM"あるとy"Y_UTM"です。これはまったく機能しません。

私は後にしています出力は、この(上記の番号から得られていない)のようなものになります。

# Place Closest 
#  1 2, 5 
#  2  1 
#  3  NA 
#  4  5 
#  5 1, 4 
#  6  NA 
+0

が私を修正しますが、あなたの距離関数は、2つの_points_、すなわち2 xと2つのY値を受け入れるべきではないのですか? –

+0

はい。私は各行の間の距離を計算したいと思います。すべての行についてsqr((X_UTM [1] - X_UTM [i])^ 2 - (Y_UTM [1] - Y_UTM [i])^ 2)であり、[i]が1000未満であることを記録する。 –

+1

あなたは 'dst < - as.matrix(dist(d [-1]))をしません。 diag(dst)< - NA; diag apply(dst、1、function(x)paste(which(x <1000)、collapse = "、")) ' – user20650

答えて

2

sp::spDistsを使用して距離行列を返し、条件に一致する各列/行の要素を見つけることもできます。例えば

:私が間違っている可能ならば

d <- read.table(text='Place X_UTM  Y_UTM 
1  574261.98 6140492.13 
2  571251.23 6141669.26 
3  570841.92 6142534.86 
4  570233.75 6141212.5 
5  578269.25 6140303.78 
6  575067.07 6137444.36', header=TRUE) 
library(sp) 
i <- apply(spDists(as.matrix(d[, c('X_UTM', 'Y_UTM')])), 2, 
      function(x) paste(which(x < 1000 & x != 0), collapse=', ')) 

data.frame(Place=d$Place, Closest=i) 

## Place Closest 
## 1  1   
## 2  2  3 
## 3  3  2 
## 4  4   
## 5  5   
## 6  6   
+1

は完全に機能します。そのspDistをパッケージspに追加するだけです。どうもありがとう。 –

+0

'dist'もうまく動作します。[指摘](http://stackoverflow.com/questions/38246575/how-to-find-the-elements-of-a-vector-wich-distance-isless -an-value-in-r/38257822?noredirect = 1#comment63915843_38246575)by @ user20650。また、私の答えは、偶然の点を返すことができません - つまり、ゼロの距離を持つ任意の点は無視されます。 「自己」を無視するより良い方法は、user20650のコメントで述べたように対角を「NA」に設定することです。 – jbaums

0

を私はあなたが場所の座標に参加クロスする必要があるとしていると思います。その理由は、どのペアのプレイスも最近傍になる可能性があるため、特定のペアを排除する可能性のある先験的な情報がないと仮定すると、それらのすべてをチェックする必要があります。

クロスはあなたのデータフレームdfの参加取得する1つの方法は、mergeにパラメータとしてby = NULLを設定し、自分自身でそれをマージすることです:

df.cross <- merge(x = df, y = df, by = NULL) 
df.cross$distance <- apply(df.cross[, c('X_UTM.x', 'X_UTM.y', 'Y_UTM.x', 'Y_UTM.y')], 
     1, 
     function(x) dist(x[1], x[2], x[3], x[4])) 

すべてを行う必要があるの最小距離を見つけることですそれぞれの場所のペア。

+0

親愛なる@Tim Biegeleisen、あなたの答えに感謝します。 dist(x [1]、x [2]、x [3]、x [4])のエラー:無効な距離メソッド –

+0

あなたは 'dist'関数を再定義する必要があります2つのデカルト点に対して2つのx値と2つの値を取る。 –

関連する問題