如何计算R中同一时间步长的多个人之间的地理距离

时间:2014-08-07 17:38:10

标签: r matrix distance

对于多个人(ID,n = 13),我有一个x和y GPS位置(十进制度数)的矩阵(22467行和4列),用于多个时间步长(一小时)。数据集示例(保存为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中做到这一点?

1 个答案:

答案 0 :(得分:-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])})

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

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


更新:抱歉天真地想着欧几里德的距离。 这是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。