【问题标题】:How to calculate geographical distance between multiple individuals at same timestep in R如何在R中同时计算多个人之间的地理距离
【发布时间】:2014-08-07 17:38:09
【问题描述】:

我有一个矩阵(22467 行和 4 列)x 和 y GPS 位置(十进制度),用于多个个人(ID,n=13)的多个时间步长(一小时)。数据集示例(另存为csv文件):

ID  Time  x  y  
98427  01:00  43.97426  -59.56677

98427  02:00  43.97424  -60.56970

98428  01:00  43.97434  -60.52222

98428  02:00  43.97435  -59.24356

98429  01:00  43.97657  -59.36576

98429  02:00  43.97432  -59.98674

我想在每个时间步为所有组合计算每个人之间的距离。因此,在时间 = 01:00,98427 和 98428、98427 和 98429、98428 和 98429 之间的距离等。我该如何在 R 中做到这一点?

【问题讨论】:

    标签: r matrix distance


    【解决方案1】:
    library(plyr)
    
    data = iris
    data = data[c(1:5, 81:85, 141:145), 3:5]
    data$time = rep(1:5, 3)
    
    dlply(data, .(time), function(x) {dist(x[ , 1:2])})
    

    我刚刚玩过 iris 数据集,但方法非常相似。
    1. 按时间拆分数据
    2. 使用列 x 和 y 并传递给返回距离矩阵的 dist() 函数
    3.将每个存储为列表

    然后您可以从列表中提取值,其中每个条目都以时间命名。


    更新:抱歉天真地认为欧几里得距离。 这是Haversine距离的粗略实现。

    library(geosphere)
    
    havdist = function(x) {
      n = dim(x)[1]
      res = matrix(NA, nrow = n, ncol = n)
      for (i in 1:n) {
        k = 1
        for (j in k:n) {
          res[i, j] = res[j, i] = distHaversine(a[i, ], a[j, ])
        }
        n = n - 1
        k = k + 1
       }
      return(res)
    }
    

    然后在上面的 dlply 方法中提供 havdist 而不是 dist。

    【讨论】:

    • dist 计算笛卡尔距离。
    • 查看 Haverside 公式以获得正确的距离:en.wikipedia.org/wiki/Haversine_formula
    • @Vlo 我已经在上面更新了“geosphere”包中的 Haverside dist。谢谢指出!
    • 感谢@won782 的功能!您只有一个小错字(它需要是 x[i, ], x[j, ] 而不是 a[i, ], a[j, ]) ,但除此之外 - 它完成了工作! :)
    猜你喜欢
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    相关资源
    最近更新 更多