在 data.table 上使用 geosphere distm 函数来计算距离

问题描述 投票:0回答:2

我创建了一个包含 6 列的 data.table。我的 data.table 有一个比较两个位置的列:位置 1 和位置 2。我尝试使用 distm 函数来计算每行上位置之间的距离,创建第七列。 geosphere 包中的 distm 包需要两个不同的向量来计算每个纬度/经度组合。我下面的代码不起作用,所以我试图弄清楚如何为该函数提供向量。

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 中的列。

r data.table geosphere
2个回答
11
投票

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

更新:这个答案提供了更高效的

distHaversine
版本,可用于
data.table


0
投票

dt[, distance_hav := distm(c(LOC1_LONG_CORD, LOC1_LAT_CORD),c(LOC2_LONG_CORD, LOC2_LAT_CORD), fun = distHaversine), by=.I]

如果你的数据量不大,也可以选择这种方法。

© www.soinside.com 2019 - 2024. All rights reserved.