как рассчитать все попарные расстояния в двух измерениях - PullRequest
13 голосов
/ 30 марта 2011

Скажем, у меня есть данные, касающиеся положения животных на 2d плоскости (как определено с помощью видеонаблюдения с камеры прямо над головой). Например, матрица с 15 строками (1 для каждого животного) и 2 столбцами (позиция x и позиция y)

animal.ids<-letters[1:15]  
xpos<-runif(15) # x coordinates 
ypos<-runif(15) # y coordinates 
raw.data.t1<-data.frame(xpos, ypos)
  rownames(raw.data.t1) = animal.ids

Я хочу рассчитать все попарные расстояния между животными. Таким образом, получите расстояние от животного a (строка 1) до животного в строке 2, row3 ... row15, а затем повторите этот шаг для всех рядов, избегая лишних вычислений расстояния. Выходное значение функции, которая делает это, будет средним для всех парных расстояний. Я должен уточнить, что я имею в виду простое линейное расстояние из формулы d <-sqrt (((x1-x2) ^ 2) + ((y1-y2) ^ 2)). Любая помощь будет принята с благодарностью. </p>

Кроме того, как это можно распространить на аналогичную матрицу с произвольно большим четным числом столбцов (каждые два столбца, представляющие положения x и y в данный момент времени). Цель здесь состоит в том, чтобы вычислить средние попарные расстояния для каждых двух столбцов и вывести таблицу с каждой временной точкой и соответствующим ей средним попарным расстоянием. Вот пример структуры данных с 3 временными точками:

xpos1<-runif(15) 
ypos1<-runif(15) 
xpos2<-runif(15) 
ypos2<-runif(15)
xpos3<-runif(15) 
ypos3<-runif(15)
pos.data<-cbind(xpos1, ypos1, xpos2, ypos2, xpos3, ypos3)
    rownames(pos.data) = letters[1:15]

Ответы [ 2 ]

13 голосов
/ 30 марта 2011

Метко названный dist() сделает это:

x <- matrix(rnorm(100), nrow=5)
dist(x)

         1        2        3        4
2 7.734978                           
3 7.823720 5.376545                  
4 8.665365 5.429437 5.971924         
5 7.105536 5.922752 5.134960 6.677726

Подробнее см. ?dist

1 голос
/ 05 января 2012

Почему вы сравниваете d <-sqrt (((x1-x2) ^ 2) + ((y1-y2) ^ 2))? </p>

Do d ^ 2 <- (((x1-x2) ^ 2) + ((y1-y2) ^ 2)). Это будет стоить вам намного меньше. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...