跨多个数据帧的经度之间的最小距离

问题描述 投票:0回答:1

我有一个名为A的数据框,在单独的列中有经度和纬度。样本数据

ID   Lat          Long    
a          10.773046   76.6392061   
b          10.7751978  76.6368363 
c          12.954027   78.988818 
d          12.9608638  77.521573 

我有一个名为Test的数据框,在单独的列中有lat long。样本数据

Store   Lat          Long    
a          21.244769   81.63861
b          9.919337    78.14844
c          10.053961   76.32757
d          13.829922   77.49369
e          23.849729   77.93647

我想循环遍历每个ID,以找到距他的经纬度和商店经纬度最近的商店的最小距离。因此ID a将检查a,b,c,d和e并找到最近的商店。

目标-查找最小距离和商店名称。

输出应显示我

Id          Lat          Long       Store   Distance 
a          10.773046   76.6392061   b         50ms


a$Distance <- NA  # Make an "empty" variable in my data.frame

myFunction <- function(x, y){
  distm(c(lon1, lat1), c(lon2, lat2), fun = distHaversine)
}


for(ii in a){
  for(jj in Test){
    tempX <- a[a$Lat == ii & Store$Lat== jj, c("Lat")]
    tempY <- a[a$Long == ii & Store$Long == jj, c("Long")]
    # "Save" results into appropriate location in my data.frame
    myFunction(tempX,tempY)
  }
}

我无法获得确切的输出。

r
1个回答
0
投票

您可以检查出这个

a <- data.frame(ID = c("a", "b", "c", "d"),    Lat = c(10.773046, 10.7751978, 12.954027, 12.9608638), 
                Long = c(76.6392061, 76.6392061, 78.988818, 77.521573))    


b <- data.frame(Store = c("a", "b", "c", "d", "e"), Lat = c(21.244769,  9.919337, 10.053961, 13.829922, 23.849729), 
                Long = c(81.63861, 78.14844, 76.32757, 77.49369, 77.93647))

library(tidyverse)

a1 <- a %>%
  group_by(Lat, Long) %>%
  summarise(closest = which.min(abs(Lat - b$Lat) + abs(Long - b$Long))) %>%
  mutate(Store  = b$Store[closest],
         Distance = sqrt((Lat - b$Lat[closest])^2 + (Long - b$Long[closest])^2))

将导致:

a1
    Lat  Long closest Store Distance
  <dbl> <dbl>   <int> <fct>    <dbl>
1  10.8  76.6       3 c        0.784
2  10.8  76.6       3 c        0.786
3  13.0  79.0       4 d        1.73 
4  13.0  77.5       4 d        0.870
© www.soinside.com 2019 - 2024. All rights reserved.