私は学校と海岸線の間の最短距離を見つけようとしています。学校はすべて東と北の形式であり、海岸線は東方と北方の形式でもポイントで構成されています。2つのデータセットでUTMポイント間の最短距離を達成するR
私は、学校の場所とすべての海岸線のポイントを比較する学校のループ内の各学校と別のループを通過するループを持つことでこれを解決しました。私が40000の学校と180000の地図ポイントを持っているので、これは信じられないほど遅く、あなたはRで決してループを使うべきではないことを知っています!
テストデータ::私は一緒に以下を入れてみました
schools <- structure(list(URN = c(100000L, 100008L, 100009L, 100010L, 100011L, 100012L), Easting = c(533498L, 530238L, 524888L, 529912L, 528706L, 528386L), Northing = c(181201L, 182761L, 185067L, 184835L, 186594L, 185209L)), .Names = c("URN", "Easting", "Northing"), row.names = c(NA, 6L), class = "data.frame")
coastline <- structure(list(Easting = c(219588.203816721, 219623.335092579, 219625.861360502, 219661.118975722, 219664.898582579, 219700.155464073), Northing = c(607325.869617586, 607324.434359255, 607386.276450707, 607384.83630279, 607477.377010103, 607475.937159766)), .Names = c("Easting", "Northing"), row.names = c(NA, 6L), class = "data.frame")
コード
for (sch in schools$URN){
minimumDistance <- 500000
SEasting <- schools %>% filter(URN == sch) %$% Easting
SNorthing <- schools %>% filter(URN == sch) %$% Northing
mindisance <- coastline %>% mutate(distance =
min(sqrt((SEasting - Easting)^2 +
(SNorthing - Northing)^2))) %$% distance
print(paste(sch, "minDistance = ", mindisance))
}
しかし、私は、各海岸線のポイントの結果を得る:
[1] "100000 minDistance = 529243.315102678" "100000 minDistance = 529243.315102678"
[3] "100000 minDistance = 529243.315102678" "100000 minDistance = 529243.315102678"
[5] "100000 minDistance = 529243.315102678" "100000 minDistance = 529243.315102678"
私がしたいのは
です私が間違っていることは何ですか?
ありがとうございます! – pluke
スピードアップしましたか? 'print()'の作業の1/'nrow()'だけを行う必要があります。 –
かなりのように、行列の点で考えて周りに頭を浮かべて得た – pluke