我有两个数据框,每个数据框有三个变量:location_id
,latitude
和longitude
。对于第一个数据框中的每个location_id
,我必须在第二个数据框中找到最接近的location_id
,以及每个df的location_id
之间的距离。
我尝试使用expand.grid
将两个数据框的所有可能组合放在一起(工作),但是当我尝试将原始列表中的纬度和经度合并到我的超级列表上时,我内存不足(第一个数据帧中有7000个location_ids,第二个数据帧中有5000个location_ids
。
我能够得到等式来计算堆栈溢出处其他地方两点之间的距离:
earth.dist <- function (long1, lat1, long2, lat2)
{
rad <- pi/180
a1 <- lat1 * rad
a2 <- long1 * rad
b1 <- lat2 * rad
b2 <- long2 * rad
dlon <- b2 - a2
dlat <- b1 - a1
a <- (sin(dlat/2))^2 + cos(a1) * cos(b1) * (sin(dlon/2))^2
c <- 2 * atan2(sqrt(a), sqrt(1 - a))
R <- 6378.145
d <- R * c
return(d)
}
但是我很难在这个问题的背景下应用它。任何帮助表示赞赏!
编辑:
数据集看起来完全像这样:
location_id LATITUDE LONGITUDE
211099 32.40913 -99.78064
333547 32.45192 -100.39325
369561 32.47458 -99.69176
123141 33.68169 -96.60887
386913 33.99921 -96.40743
123331 31.96173 -83.75830
答案 0 :(得分:2)
这可能会对你有所帮助。它不是最优雅的答案,但对于适合您规模的数据框架,这应该可以很好地完成工作。
require(geosphere)
require(dplyr)
DB1 <- data.frame(location_id=1:7000,LATITUDE=runif(7000,min = -90,max = 90),LONGITUDE=runif(7000,min = -180,max = 180))
DB2 <- data.frame(location_id=7001:12000,LATITUDE=runif(5000,min = -90,max = 90),LONGITUDE=runif(5000,min = -180,max = 180))
DistFun <- function(ID){
TMP <- DB1[DB1$location_id==ID,]
TMP1 <- distGeo(TMP[,3:2],DB2[,3:2])
TMP2 <- data.frame(DB1ID=ID,DB2ID=DB2[which.min(TMP1),1],DistanceBetween=min(TMP1) )
print(ID)
return(TMP2)
}
DistanceMatrix <- rbind_all(lapply(DB1$location_id, DistFun))
head(DistanceMatrix)
Source: local data frame [6 x 3]
DB1ID DB2ID DistanceBetween
1 1 9386 24907.35
2 2 11823 264295.86
3 3 9118 12677.62
4 4 11212 237730.78
5 5 11203 26775.01
6 6 7607 83904.84