我创建了一个data.table,它有6列.我的data.table有一个列可以计算两个位置:位置1和位置2.我正在尝试使用distm函数来计算每行上位置之间的距离,从而创建第7列.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中的列.
该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