まず、あなたの空港の経度は、負でなければならないときにはプラスになり、結果が失われます。結果は、より多くの意味を作るそれでは、それらを修正してみましょう:
airports$long <- -airports$long
さて、あなたは各空港のすべてのパイロットを評価するapply
を使用することができます。 geosphere
パッケージには、distGeo
とdistHaversine
を含む直線距離を計算する関数がいくつかあります。
library(geosphere)
pilots$closest_airport <- apply(pilots[, 3:2], 1, function(x){
airports[which.min(distGeo(x, airports[, 3:2])), 'code']
})
pilots$airport_distance <- apply(pilots[, 3:2], 1, function(x){
min(distGeo(x, airports[, 3:2]))/1000 # /1000 to convert m to km
})
pilots
## names lat long closest_airport airport_distance
## 1 James 32.33513 -84.98907 STL 862.5394
## 2 Fiona 44.91322 -97.15133 Denver 855.8088
## 3 Seamus 28.84963 -96.91724 IAH 196.3559
またはあなたがすべての距離だけではなく、最低1、apply
起因するcbind
行列たい場合:
dplyr
に翻訳
pilots <- cbind(pilots, t(apply(pilots[, 3:2], 1, function(x){
setNames(distGeo(x, airports[, 3:2])/1000, airports$code)
})))
pilots
## names lat long closest_airport IAH DFW Denver STL
## 1 James 32.33513 -84.98907 STL 1021.6523 1131.2129 1965.6586 862.5394
## 2 Fiona 44.91322 -97.15133 Denver 1666.0359 1333.6842 855.8088 885.8480
## 3 Seamus 28.84963 -96.91724 IAH 196.3559 449.1838 1412.0664 1253.4874
、plyr
、
の後継を
library(dplyr)
pilots %>% rowwise() %>%
mutate(closest_airport = airports[which.min(distGeo(c(long, lat), airports[, 3:2])), 'code'],
airport_distance = min(distGeo(c(long, lat), airports[, 3:2]))/1000)
## Source: local data frame [3 x 5]
## Groups: <by row>
##
## # A tibble: 3 × 5
## names lat long closest_airport airport_distance
## <fctr> <dbl> <dbl> <fctr> <dbl>
## 1 James 32.33513 -84.98907 STL 862.5394
## 2 Fiona 44.91322 -97.15133 Denver 855.8088
## 3 Seamus 28.84963 -96.91724 IAH 196.3559
またはすべての距離については、0123を使用してください上記のアプローチと、またはunnest
リスト列と再構築:
library(tidyverse)
pilots %>% rowwise() %>%
mutate(closest_airport = airports[which.min(distGeo(c(long, lat), airports[, 3:2])), 'code'],
data = list(data_frame(airport = airports$code,
distance = distGeo(c(long, lat), airports[, 3:2])/1000))) %>%
unnest() %>%
spread(airport, distance)
## # A tibble: 3 × 8
## names lat long closest_airport Denver DFW IAH STL
## * <fctr> <dbl> <dbl> <fctr> <dbl> <dbl> <dbl> <dbl>
## 1 Fiona 44.91322 -97.15133 Denver 855.8088 1333.6842 1666.0359 885.8480
## 2 James 32.33513 -84.98907 STL 1965.6586 1131.2129 1021.6523 862.5394
## 3 Seamus 28.84963 -96.91724 IAH 1412.0664 449.1838 196.3559 1253.4874
以上の直接的あまり読みやすくし、
pilots %>% rowwise() %>%
mutate(closest_airport = airports[which.min(distGeo(c(long, lat), airports[, 3:2])), 'code'],
data = (distGeo(c(long, lat), airports[, 3:2])/1000) %>%
setNames(airports$code) %>% t() %>% as_data_frame() %>% list()) %>%
unnest()
## # A tibble: 3 × 8
## names lat long closest_airport IAH DFW Denver STL
## <fctr> <dbl> <dbl> <fctr> <dbl> <dbl> <dbl> <dbl>
## 1 James 32.33513 -84.98907 STL 1021.6523 1131.2129 1965.6586 862.5394
## 2 Fiona 44.91322 -97.15133 Denver 1666.0359 1333.6842 855.8088 885.8480
## 3 Seamus 28.84963 -96.91724 IAH 196.3559 449.1838 1412.0664 1253.4874
OPは、それぞれのパイロットがあるパイロット最寄りのではない主要などの空港を決定しようとしています各空港に最も近い – HubertL
@HubertLUops、それを後方に読んでください。一定。 – alistaire
あなたはそれを後ろに読んでいるので、それは後ろに書かれています。 – HubertL