如何找到两个不同数据帧之间的最近距离

时间:2017-06-17 19:37:35

标签: r distance latitude-longitude

我试图找到数据集1中数据集2的最近位置距离。两个数据集的大小不同。我已经考虑过使用Haversine功能,但我不确定我需要做什么。

1 个答案:

答案 0 :(得分:1)

由于您尚未提供数据样本,因此我将使用UScensus2000tract库中的data.table数据集作为可重现的示例。

以下是我从this other answer here获得的基于快速# load libraries library(data.table) library(geosphere) library(UScensus2000tract) library(rgeos) 的解决方案。

data.table

现在让我们创建一个新的# 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') ,其中包含所有可能的原点组合(人口普查中心)和目的地(设施)

int