【发布时间】:2020-01-16 09:05:00
【问题描述】:
我正在尝试参考我的原始 data.frame 在 data.frame 中查找最近的 LAT_LON 的 ID。我已经通过将两个 data.frames 合并到一个唯一标识符上并根据来自geosphere 的distHaverSine 函数计算距离来解决这个问题。现在,我想更进一步,在没有唯一标识符的情况下加入 data.frames,并找到最近的 LAT-LON 的 ID。
合并后我使用了以下代码:
v3 <-v2 %>% mutate(CTD = distHaversine(cbind(LON.x, LAT.x), cbind(LON.y, LAT.y)))
数据:
loc <- data.frame(station = c('Baker Street','Bank'),
lat = c(51.522236,51.5134047),
lng = c(-0.157080, -0.08905843),
postcode = c('NW1','EC3V'))
stop <- data.frame(station = c('Angel','Barbican','Barons Court','Bayswater'),
lat = c(51.53253,51.520865,51.490281,51.51224),
lng = c(-0.10579,-0.097758,-0.214340,-0.187569),
postcode = c('EC1V','EC1A', 'W14', 'W2'))
作为最终结果,我想要这样的结果:
df <- data.frame(loc = c('Baker Street','Bank','Baker Street','Bank','Baker Street','Bank','Baker
Street','Bank'),
stop = c('Angel','Barbican','Barons Court','Bayswater','Angel','Barbican','Barons Court','Bayswater'),
dist = c('x','x','x','x','x','x','x','x'),
lat = c(51.53253,51.520865,51.490281,51.51224,51.53253,51.520865,51.490281,51.51224),
lng = c(-0.10579,-0.097758,-0.214340,-0.187569,-0.10579,-0.097758,-0.214340,-0.187569),
postcode = c('EC1V','EC1A', 'W14', 'W2','EC1V','EC1A', 'W14', 'W2')
)
感谢任何帮助。谢谢。
【问题讨论】:
-
@RonakShah,由于我的数据集太大,因此无法解决问题。长时间保持计算
-
这是另一个潜在的选择。 stackoverflow.com/questions/58831578/…。这是一个 M*N 问题,因为任一数据帧都会增长,它只需要更长的时间。要提高性能,请减小问题的大小,或者使用分治算法,或者将起始位置的精度从小数点后 5 位降低到 3 位。如果对起始位置进行四舍五入,可能会发现大量重复项,从而节省重新计算的时间。
-
感谢@Dave2e。我无法降低精度,因为我正在处理彼此非常接近的对象。我可以减小问题的大小,
distmatrix默认计算Haversine distance吗?谢谢 -
我相信它使用了
distGeo方法,该方法假定为椭圆体而不是球体。