Как рассчитать все попарные расстояния в двух измерениях
Скажем, у меня есть данные о положении животных на 2-й плоскости (как определено с помощью видеомониторинга с камеры непосредственно над головой). Например, матрица с 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)). Любая помощь будет принята с благодарностью.
Кроме того, как это можно распространить на аналогичную матрицу со сколь угодно большим четным числом столбцов (каждые два столбца, представляющие позиции x и y в данный момент времени). Цель здесь заключалась бы в вычислении средних парных расстояний для каждых двух столбцов и выводе таблицы с каждой временной точкой и ее соответствующим средним парным расстоянием. Ниже приведен пример структуры данных с тремя временными точками:
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]
Ответы
Ответ 1
Точно названный 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
Ответ 2
Почему вы сравниваете d < -sqrt (((x1-x2) ^ 2) + ((y1-y2) ^ 2))?
Do d ^ 2 < - (((x1-x2) ^ 2) + ((y1-y2) ^ 2)). Это будет стоить вам гораздо меньше.