我正在從一組數據(set1
)到另一組數據(set2
)找到5個最近的車站。 This帖子是我用作基礎,它似乎很容易找到最接近的,但我正在寫for
循環來處理它,並沒有效率。此外,我越來越和錯誤,不明白爲什麼它不工作。理想情況下,我想用set1
查找set2
附近最近的車站,發現最近的5個車站,併爲每個車站添加一個列,每個唯一的標識符爲set1
。查找離緯度/經度座標最近的5個車站
編輯:這個問題不同於How to assign a name to lat-long observations based on shortest distance因爲我試圖找到5個最近的站,而不僅僅是一個單一的距離。此外,找到最小值的方法也不同。請重新打開這個問題。
dput:
set1 <- structure(list(id = c(5984, 7495, 4752, 2654, 4578, 9865, 3265,
1252, 4679, 1346), lat = c(48.39167, 48.148056, 48.721111, 47.189167,
47.054443, 47.129166, 47.306667, 47.84, 47.304167, 48.109444),
lon = c(13.671114, 12.866947, 15.94223, 11.099736, 12.958342,
14.203892, 11.86389, 16.526674, 16.193064, 17.071392)), row.names = c(NA,
10L), class = "data.frame", .Names = c("id", "lat", "lon"))
set2 <- structure(list(id = 1:10, lat = structure(c(35.8499984741211,
34.75, 70.9329986572266, 78.25, 69.6829986572266, 74.515998840332,
70.3659973144531, 67.265998840332, 63.6990013122559, 60.1990013122559
), .Dim = 10L), lon = structure(c(14.4829998016357, 32.4000015258789,
-8.66600036621094, 15.4670000076294, 18.9160003662109, 19.0160007476807,
31.0990009307861, 14.3660001754761, 9.59899997711182, 11.0830001831055
), .Dim = 10L)), row.names = c(NA, 10L), class = "data.frame", .Names = c("id",
"lat", "lon"))
代碼:
library(rgeos)
library(sp)
set1sp <- SpatialPoints(set1)
set2sp <- SpatialPoints(set2)
for (i in length(set1$id)){
for (j in 4:9){
if(i == 1) {
sub <- set2
set1[i,j] <- apply(gDistance(set1sp, set2sp, byid=TRUE), 1, which.min)
sub <- filter(sub, id != set1[i,j])}
else{
set1[i,j] <- apply(gDistance(set1sp, set2sp, byid=TRUE), 1, which.min)
sub <- filter(sub, id != set1[i,j])}
}
}
輸出錯誤:
Error in `[<-.data.frame`(`*tmp*`, i, j, value = c(8L, 8L, 8L, 8L, 8L, :
replacement has 10 rows, data has 1
很可能正在生成的錯誤,因爲你缺少一個'1:''之前的長度(集1的$ id)' –
什麼是'set1sp'和'set2sp'?他們沒有定義。另外,您的要點是什麼投影系統?如果你只想添加5列,你可能需要'j在4:8'而不是9。 –
@JaredSmith對不起,我添加了set1sp和set2sp – Vedda