我是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 + 1 =原22) – ayshelina
如果內的其他21個地方我理解你的照片,然後我只需要一個數據框,其中每個圓的中心和每個圓的半徑的長度和長度,然後我計算每個圓的中心的樣本數據中每個點的距離,並看到是否落入半徑範圍內。但我仍然不明白你想要輸出的是什麼。如果給定的點在一個以上的圓內? – eipi10
從我所瞭解的情況來看,這是有道理的,應該足以滿足我想要完成的視覺輸出。我將不得不努力確保:) – ayshelina