对于多个人(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中做到这一点?
答案 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。