【问题标题】:Compute distance between multiple sets of coordinates计算多组坐标之间的距离
【发布时间】:2020-08-24 17:55:08
【问题描述】:

我有一个坐标数据集,它们按时间合并到一个数据框中,标题中带有单独的 ID。例如:

> Date_time<-c("2015/03/04 01:00:00","2015/03/04 02:00:00","2015/03/04 03:00:00","2015/03/04 04:00:00")
> lat.1<-c(63.81310,63.83336,63.83250,63.82237)
> long.1<-c(-149.1176,-149.0193,-149.0249,-149.0408)
> lat.2<-c(63.85893 ,63.85885,63.86108,63.86357)
> long.2<-c(-151.1336,-151.1336,-151.1236,-151.1238)
> lat.3<-c(63.87627,63.87670, 63.85044,63.85052)
> long.3<-c(-149.5029,-149.5021,-149.5199,-149.5199)
> 
> data<-data.frame(Date_time,lat.1,long.1,lat.2,long.2,lat.3,long.3)
> data
          Date_time lat.1  long.1  lat.2  long.2  lat.3  long.3
1 2015/03/04 01:00:00 63.8131 -149.1176 63.85893 -151.1336 63.87627 -149.5029
2 2015/03/04 02:00:00 63.8131 -149.1176 63.85893 -151.1336 63.87627 -149.5029
3 2015/03/04 03:00:00 63.8131 -149.1176 63.85893 -151.1336 63.87627 -149.5029
4 2015/03/04 04:00:00 63.8131 -149.1176 63.85893 -151.1336 63.87627 -149.5029

我想计算每个人之间的距离,因此在 1 和 2、1 和 3 以及 2 和 3 之间。我的数据框有比这更多的人,所以我希望应用循环函数。

我可以单独使用

> data$distbetween12<-distHaversine(cbind(data$long.1,data$lat.1), cbind(data$long.2,data$lat.2))
> data$distbetween12
[1] 99083.48 99083.48 99083.48 99083.48

但是我可以在不输入每个配对组合的情况下计算所有配对距离吗?

谢谢!

【问题讨论】:

    标签: r coordinates distance pairwise


    【解决方案1】:

    这是一个依靠combn 函数生成必要组合的解决方案。如果您有超过 3 对 latlong 列,只需将 combn 函数中的第一个数字更改为正确的对数即可。

    请注意,此解决方案还要求您的列严格遵守命名 lat.1 long.1lat.2long.2 等。

     combos <- combn(3, 2)
     
     cbind(data, as.data.frame(`colnames<-`(apply(combos, 2, function(x) { 
       lats <- paste0("lat.", x)
       lons <- paste0("long.", x)
       geosphere::distHaversine(cbind(data[[lons[1]]], data[[lats[1]]]), 
                                cbind(data[[lons[2]]], data[[lats[2]]]))
       }), apply(combos, 2, paste, collapse = " v "))))
     
    #>             Date_time    lat.1    long.1    lat.2    long.2    lat.3    long.3
    #> 1 2015/03/04 01:00:00 63.81310 -149.1176 63.85893 -151.1336 63.87627 -149.5029
    #> 2 2015/03/04 02:00:00 63.83336 -149.0193 63.85885 -151.1336 63.87670 -149.5021
    #> 3 2015/03/04 03:00:00 63.83250 -149.0249 63.86108 -151.1236 63.85044 -149.5199
    #> 4 2015/03/04 04:00:00 63.82237 -149.0408 63.86357 -151.1238 63.85052 -149.5199
    #>       1 v 2    1 v 3    2 v 3
    #> 1  99083.48 20172.13 79974.87
    #> 2 103778.13 24168.80 80014.97
    #> 3 103020.61 24374.46 78669.90
    #> 4 102317.93 23724.27 78680.61
    
    

    【讨论】: