Использование функции геосферы distm в таблице данных для расчета расстояний

Я создал data.table в котором есть 6 столбцов. В моем data.table есть столбцы, сравнивающие два местоположения: Location 1 и Location 2. Я пытаюсь использовать функцию distm для вычисления расстояния между местоположениями в каждой строке, создавая 7-й столбец. Пакет distm в пакете geosphere требует двух разных векторов для каждого широта / длинная комбинация, для которой необходимо рассчитать. Мой код ниже не работает, поэтому я пытаюсь выяснить, как обеспечить векторы для функции.

LOC_1_ID LOC1_LAT_CORD LOC1_LONG_CORD LOC_2_ID LOC2_LAT_CORD LOC2_LONG_CORD
 1       35.68440        -80.48090        70624    34.86752   -82.46632
 6       35.49770        -80.62870        70624    34.86752   -82.46632
10       35.66042        -80.50053        70624    34.86752   -82.46632

Предполагая, что res содержит data.table, приведенный ниже код не работает.

 res[,DISTANCE := distm(c(LOC1_LAT_CORD, LOC1_LONG_CORD),c(LOC2_LAT_CORD, LOC2_LONG_CORD), fun=distHaversine)*0.000621371]

Если бы я вытащил каждый вектор, функция работает нормально.

loc1 <- res[LOC1_ID == 1,.(LOC1_LAT_CORD, LOC1_LONG_CORD)]
loc2 <- res[LOC2_ID==70624,.(LOC2_LAT_CORD, LOC2_LONG_CORD)]
distm(loc1, loc2, fun=distHaversine)

На самом деле мой вопрос заключается в том, как применять функции для выбора столбцов в data.table, когда этой функции требуются векторы в качестве параметров.

 thelatemail11 дек. 2015 г., 00:42
Ваш второй пример кода, который «работает нормально», не работает. Вы пропускаете закрытие) в каждом случае, и я думаю, что вы должны использоватьlist() вместоc() тем не мение.

Ответы на вопрос(1)

distm функция генерируетМатрица расстояний множества точек, Вы уверены, что эта функция вам нужна, если вы просто сравниваете точки в каждой строке и добавляете один столбец?

Похоже, вы на самом деле хотите либоdistHaversine или жеdistGeo

library(data.table)
library(geosphere)

dt <- read.table(text = "LOC_1_ID LOC1_LAT_CORD LOC1_LONG_CORD LOC_2_ID LOC2_LAT_CORD LOC2_LONG_CORD
1       35.68440        -80.48090        70624    34.86752   -82.46632
6       35.49770        -80.62870        70624    34.86752   -82.46632
10       35.66042        -80.50053        70624    34.86752   -82.46632", header = T)

setDT(dt)
dt[, distance_hav := distHaversine(matrix(c(LOC1_LONG_CORD, LOC1_LAT_CORD), ncol = 2),
                                   matrix(c(LOC2_LONG_CORD, LOC2_LAT_CORD), ncol = 2))]

#     LOC_1_ID LOC1_LAT_CORD LOC1_LONG_CORD LOC_2_ID LOC2_LAT_CORD LOC2_LONG_CORD distance_hav
# 1:        1      35.68440      -80.48090    70624      34.86752      -82.46632     202046.3
# 2:        6      35.49770      -80.62870    70624      34.86752      -82.46632     181310.0
# 3:       10      35.66042      -80.50053    70624      34.86752      -82.46632     199282.1
 SymbolixAU06 мая 2019 г., 02:57
Я написал упрощенную версиюdistHaversine заэтот ответ так что это более естественно вписывается в вызов data.table.
 Jaime Caffarel03 сент. 2016 г., 11:31
+1! Я не могу понять, почему код сmatrix работает, но этот:dt[, distance_hav := distHaversine(c(LOC1_LONG_CORD, LOC1_LAT_CORD), c(LOC2_LONG_CORD, LOC2_LAT_CORD))] не делает. Из виньетки,distHaversine можно получить либо два вектора, либо две матрицы ...

Ваш ответ на вопрос