生成成对的“距离”矩阵

时间:2018-12-10 23:03:47

标签: r matrix pairwise pairwise-distance

我正在尝试从包含两个相邻点之间距离的数据帧中生成最能描述成对的距离矩阵。这些距离不是欧几里得距离,本质上是海岸线上两点之间的距离,因此该距离不是直线。我可以使用地理空间数据在数据包riverdist中生成一个距离矩阵,但这仅完成了两点之间的完整距离,现在我尝试对这两个点之间的距离做一个子集。

我一直在寻找一种可以做到这一点的方法,并且可以空手而归。任何帮助将非常感激。

这是一个例子:

我有此数据:

mat <- matrix(
 c(
     3, #distance between 1 and 2
    10, #distance between 2 and 3
     7, #distance between 3 and 4
     9  #distance between 4 and 5
),
nrow=4, ncol=1, dimnames =     list(c("site1","site2","site3","site4"),c("dist")))

> mat
  dist
site1    3
site2   10
site3    7
site4    9

我想产生以下“距离”矩阵:

     site1 site2 site3 site4 site5
site1    0
site2    3     0     
site3   13    10     0   
site4   20    17     7     0
site5   29    26    16     9     0

对于此任务,原始数据可能会组织得更好,如下所示:

     SiteA SiteB Dist
   1 site1 site2    3
   2 site2 site3   10
   3 site3 site4    7
   4 site4 site5    9

那里有什么建议吗?

3 个答案:

答案 0 :(得分:2)

我认为您可能过于关注实际距离,而您的问题更多是求和问题。

至少据我了解,您无需寻找最短路径或类似问题,而只需添加数字即可。因此,从ab,意味着从变量a开始将行b-1添加到mat。唯一困难的是处理从和到向后或相同的情况。无论如何,我得到了:

dist <- function(a,b) abs(sum(if(a>1 && b>1) mat$dist[(a:b)-1][-1] else mat$dist[(a:b)-1]))
distmat <- sapply(1:5, function(i) {
  sapply(1:5, dist, i)
})

答案 1 :(得分:1)

这可以做到(尽管可能有点慢):

dist = function(mat){
    tmp_mat = c(0, mat)
    dist_mat = diag(0, length(mat)+1)
    for (i in 1:length(mat))
        dist_mat[(i+1):(length(mat)+1),i] = cumsum(tmp_mat[-(1:i)])

    dist_mat = dist_mat + t(dist_mat)
    return (dist_mat)
    }
dist(mat)

答案 2 :(得分:1)

这是一个累积距离,因此请使用cum ulul sum,然后进行dist ance的计算:

mat <- c(3,10,7,9)
dist(cumsum(c(0,mat)))
#   1  2  3  4
#2  3         
#3 13 10      
#4 20 17  7   
#5 29 26 16  9