Как рассчитать расстояние между двумя точками в трехмерной системе координат в R - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь вычислить расстояние между двумя точками в трехмерной системе координат. У меня есть две точки: 1) «Освобождение» (x, y, z) и 2) «Перехват» (x, y, z). Я хочу рассчитать евклидово расстояние между этими двумя точками для каждого повторно пойманного человека.

Мой импортированный набор данных в R выглядит следующим образом:

|              | Rel_x   | Rel_y   | Rel_z  | Rec_x   | Rec_y   | Rec_z  | Distance |
|--------------|---------|---------|--------|---------|---------|--------|----------|
| Individual_1 | 231.114 | 177.002 | 17.329 | 228.288 | 178.908 | 17.243 | ?        |
| Individual_2 | 239.028 | 178.789 | 16.526 | 239.057 | 178.706 | 16.499 | ?        |
| Individual_3 | 212.109 | 210.142 | 18.791 | 212.300 | 208.693 | 18.372 | ?        |

Я также хочу добавить столбец (расстояние), чтобы сообщить евклидово расстояние между двумя точками «Освобождение» и «Повторный захват»'.

Я пытался использовать функцию dist (), но я не уверен, что моя строка кода верна, например,

dist (data_set), method = "euclidean", diag = FALSE, upper = FALSE, p = 2) 

Когда я запускаю эту строку кода, я получаюследующее:

Warning message: In dist(data_set) : NAS introduced by coercion 

Есть ли у вас какие-либо предложения?

Ответы [ 2 ]

2 голосов
/ 04 ноября 2019

Разделите фрейм данных на два, раздельно для каждой точки Освобождение и Повторный захват, а затем вычислите евклидову метрику.

Например, предположим, что ваш фрейм данных называется df, и первые три столбцадля первой точки, а следующие 3 столбца для второй точки:

sqrt(rowSums(((df[,1:3]-df[,4:6])^2))
0 голосов
/ 04 ноября 2019

Я бы рекомендовал просто написать это. Вызывая ваши данные data_set, мы можем адаптировать другой ответ к рабочему:

data_set$distance = sqrt(rowSums((data_set[, 1:3] - data_set[, 4:6])^2))

Более безопасный подход - назвать столбцы, а не полагаться на позиционный порядок:

data_set$distance = sqrt(rowSums(
  (data_set[, c('Rel_x', 'Rel_y', 'Rel_z')] - data_set[, c('Rec_x', 'Rec_y', 'Rec_z')])^2
))

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