J'essaie de trouver la distance la plus proche des emplacements dans l'ensemble de données 1 à l'ensemble de données 2. Les deux ensembles de données sont de tailles différentes. J'ai étudié la fonction Haversine mais je ne suis pas sûr de ce que je devrais faire après.Comment trouver la distance la plus proche entre deux trames de données différentes
0
A
Répondre
1
Puisque vous n'avez pas fourni un échantillon de vos données, je vais utiliser l'ensemble de données oregon.tract
de la bibliothèque UScensus2000tract
comme exemple reproductible.
Voici une solution basée sur data.table
rapide que j'obtiens de this other answer here.
# load libraries
library(data.table)
library(geosphere)
library(UScensus2000tract)
library(rgeos)
Maintenant, nous allons créer une nouvelle data.table
avec toutes les combinaisons de paires possibles d'origines (centroïdes de recensement) et les destinations (installations)
# get all combinations of origin and destination pairs
# Note that I'm considering here that the distance from A -> B is equal
from B -> A.
odmatrix <- CJ(Datatwo$Code_A , Dataone$Code_B)
names(odmatrix) <- c('Code_A', 'Code_B') # update names of columns
# add coordinates of Datatwo centroids (origin)
odmatrix[Datatwo, c('lat_orig', 'long_orig') := list(i.Latitude,
i.Longitude), on= "Code_A" ]
# add coordinates of facilities (destination)
odmatrix[Dataone, c('lat_dest', 'long_dest') := list(i.Latitude,
i.Longitude), on= "Code_B" ]
Now you just need to:
# calculate distances
odmatrix[ , dist := distHaversine(matrix(c(long_orig, lat_orig), ncol
= 2),
matrix(c(long_dest, lat_dest), ncol
= 2))]
# and get the nearest destinations for each origin
odmatrix[, .( Code_B = Code_B[which.min(dist)],
dist = min(dist)),
by = Code_A]
### Prepare data for this reproducible example
# load data
data("oregon.tract")
# get centroids as a data.frame
centroids <- as.data.frame(gCentroid(oregon.tract,byid=TRUE))
# Convert row names into first column
setDT(centroids, keep.rownames = TRUE)[]
# get two data.frames equivalent to your census and facility data
frames
Datatwo<- copy(centroids)
Dataone <- copy(centroids)
names(Datatwo) <- c('Code_A', 'Longitude', 'Latitude')
names(Dataone) <- c('Code_B', 'Longitude', 'Latitude')
J'ai changé le code/exemple reproductible pour le rendre plus proche de votre propres données. J'espère que la réponse/explication est plus claire maintenant –
Je ne sais pas, mais je l'ai juste googlé et j'ai trouvé ce https://stackoverflow.com/questions/36110815/how-to-use-disthaversine-function https://stackoverflow.com/questions/21496587/error-in-pointstomatrixp1-latitude-90 –
lisez le fichier d'aide de '? geosphere :: distHaversine' - il est dit" Valeur: Vecteur de distances dans la même unité que r (la valeur par défaut est le nombre de mètres) " – SymbolixAU