Вычисление евклидовых расстояний между последующими позициями

У меня есть большие фреймы данных, состоящие из пар координат X и Y, и я хочу рассчитать евклидовы расстояния между последовательными координатами (минимальный размер составляет около 2000 пар координат).

Таким образом, я хочу рассчитать расстояние от строки 1 до 2, строки со 2 до 3, строки с 3 до 4 и т. Д. Этот вопрос хорошо показывает, как рассчитать евклидово расстояние между первой и последней точкой для данных трека, но мои данные ближе к:

dff <- structure(list(A = c(0L, 0L, 0L, 0L, 0L, 0L), T = 0:5, X = c(668L, 670L, 672L, 674L, 676L, 678L), Y = c(259L, 259L, 259L, 259L, 259L, 260L), V = c(NA, 0, 0, 0, 0, 0)), .Names = c("A", "T", "X", "Y", "V"), row.names = c(NA, 6L), class = "data.frame")

Кажется, что должен быть способ создать цикл для этого, но я не уверен, как это сделать. Использование dist() требует вычислений для наборов данных такого размера, и в любом случае я также не уверен, как извлекать элементы матрицы, которые являются одноразовыми по диагонали.


person rebeccmeister    schedule 20.08.2013    source источник
comment
Вы смотрели пакет sp?   -  person Frank    schedule 20.08.2013


Ответы (2)


Что-то типа

sqrt(diff(dff$X)^2 + diff(dff$Y)^2)

должно сработать. Ключевым моментом здесь является функция diff, которая показывает различия между последовательными элементами в векторе.

person blindjesse    schedule 20.08.2013

Другой подход, просто для удовольствия:

sqrt(apply(apply(dff[,c("X","Y")], 2, diff)^2, 1, sum))
person Ferdinand.kraft    schedule 20.08.2013