Генерация попарной матрицы «расстояния» - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь сгенерировать то, что лучше всего описать как матрицу парных расстояний из фрейма данных, содержащего расстояние между двумя соседними точками.Это не евклидовы расстояния, это, по сути, расстояние между точками на береговой линии, поэтому расстояние не является прямой линией.Мне удалось сгенерировать матрицу расстояний в пакете 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 голосов
/ 11 декабря 2018

Это будет сделано (хотя, возможно, немного медленно):

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)
0 голосов
/ 11 декабря 2018

Это кумулятивное расстояние, поэтому возьмите cum относительное 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
0 голосов
/ 11 декабря 2018

Я думаю, что вы, возможно, слишком сосредоточены на реальных расстояниях, в то время как ваша проблема - скорее проблема суммирования.

По крайней мере, насколько я понимаю, вам не нужно искать кратчайший маршрут или подобныйпроблема, но нужно просто добавить цифры.Таким образом, от a до b означает добавление строк 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)
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...