私はRで新しいですが、実際にはfor
ループを使用することは悪い考えです。私はそれらを使ってコードを作業していますが、大きなデータでは非常に遅いので、改善したいと思います。アルゴリズムを改善する方法をいくつか知っていますが、これをベクトル化する方法はわかりません。または、for
ループなしで行う方法です。R - 緯度/経度の巨大なデータフレームを場所に応じてグループに分割する
私は単に緯度/経度点をパラメータとして半径を持つ円にグループ化しています。
関数(のみCIRCLE_ID列の値を満たす)の出力例は、半径が100メートルに設定した:
[1] "Locations: "
latitude longitude sensor_time sensor_time2 circle_id
48.15144 17.07569 1447149703 2015-11-10 11:01:43 1
48.15404 17.07452 1447149743 2015-11-10 11:02:23 2
48.15277 17.07514 1447149762 2015-11-10 11:02:42 3
48.15208 17.07538 1447149771 2015-11-10 11:02:51 1
48.15461 17.07560 1447149773 2015-11-10 11:02:53 4
48.15139 17.07562 1447149811 2015-11-10 11:03:31 1
48.15446 17.07517 1447149866 2015-11-10 11:04:26 2
48.15266 17.07330 1447149993 2015-11-10 11:06:33 5
がだから、ループ2を有する、LOOP1は、すべてのラインを通過し、LOOP2が進みます以前のすべてのcircle_idを通って、loop1からの現在の位置がloop2からの既存の円の半径内にあるかどうかをチェックする。各circle_idの中心は、前のすべての半径の外側にある最初の位置です。
ここでは、コードです:
init_circles = function(datfr, radius) {
cnt = 1
datfr$circle_id[1] = 1
longitude = datfr$longitude[1]
latitude = datfr$latitude[1]
circle_id = datfr$circle_id[1]
datfr2 <- data.frame(longitude, latitude, circle_id)
for (i in 2:NROW(datfr)) {
for (j in 1:NROW(datfr2)) {
tmp = distHaversine(c(datfr$longitude[i],datfr$latitude[i]) ,c(datfr2$longitude[j],datfr2$latitude[j]))
if (tmp < radius){
datfr$circle_id[i] = datfr2$circle_id[j]
break
}
}
if (datfr$circle_id[i]<1){
cnt = cnt +1
datfr$circle_id[i] = cnt
datfr2[nrow(datfr2)+1,] = c(datfr$longitude[i],datfr$latitude[i],datfr$circle_id[i])
}
}
return(datfr)
}
datfrはCIRCLE_IDのセットなしの入力データフレームであり、datfr2は、既存の円を含む一時的なデータフレームです。
あなたが見ることができ、これらの円は、上側の赤い円は、その半径内に収まる21台の他の位置を有するために使用されるものは、(21 + 1元= 22)
は アレナ
http://i67.tinypic.com/vgnc0o.pngここでは、それらの円がどのように使われているかを見ることができます。上部の赤丸は、その半径内に収まる21の他の場所を持っています(21 + 1オリジナル= 22) – ayshelina
If私はあなたの絵を理解し、各円の中心と各円の半径の緯度と経度を持つデータフレームが必要です。次に、サンプルデータの各点の各円の中心からの距離を計算し、それが半径内にあるかどうか。しかし、私はまだあなたが出力をしたいものを理解していません。与えられた点が複数の円の中にある場合はどうなりますか? – eipi10
私が理解していることから、これは理にかなっており、達成したい視覚的出力に十分なはずです。しかし、私は確かにする必要があります:) – ayshelina