R 比较两个数据帧之间的纬度和经度
我在R中有两个数据帧;一个数据帧包含县的纬度和经度(df1),另一个包含关注点的纬度和经度(df2)。我希望找到一个循环,循环遍历df1行,同时搜索df2中的任何纬度/经度点是否落在与其他点的一定距离内(假设一个点的坐标为(-88.40,42.82),它将扫描df2中的任何点((-88.40+/-1.5,42,82+/-1.5)),如果答案为是/否,我想创建一个包含答案的新列 我的想法大致如下:R 比较两个数据帧之间的纬度和经度,r,merge,geospatial,distance,R,Merge,Geospatial,Distance,我在R中有两个数据帧;一个数据帧包含县的纬度和经度(df1),另一个包含关注点的纬度和经度(df2)。我希望找到一个循环,循环遍历df1行,同时搜索df2中的任何纬度/经度点是否落在与其他点的一定距离内(假设一个点的坐标为(-88.40,42.82),它将扫描df2中的任何点((-88.40+/-1.5,42,82+/-1.5)),如果答案为是/否,我想创建一个包含答案的新列 我的想法大致如下: for(x,y in 1:nrow(df1){if(x +/- 1.5 %in% df2 &
for(x,y in 1:nrow(df1){if(x +/- 1.5 %in% df2 & y +/- 1.5 %in% df2){
df1.append("yes")
}
else{
df1.append("no")
}
我知道这个函数不是。append()在R中,我只是不知道如何去做。如果只扫描匹配点就不那么复杂了,但由于它是地理空间距离,我想扫描一种半径,我对此感到迷茫。嗯,你的问题有些模糊,但这里有一种方法。因为我没有your数据,我编造了一些东西。它变成了一只老鼠她的全球区域 好消息是,PackageGeosphere附带了一个函数,可以计算您要求的距离矩阵 除此之外,我还将其重塑为一个“逐个县”的表,该表可以根据您可能有的任何ditsance标准轻松过滤
df%
重命名(开始=县)%%>%
过滤器(开始!=目的地)
##相互距离小于1000公里的任何点的组合:
距离表%>%过滤器(距离<1e6)
我明白了:
# A tibble: 92 x 3
Start Destination Distance
<chr> <chr> <dbl>
1 County 1 County 27 689265.
2 County 1 County 82 563744.
3 County 2 County 28 463513.
4 County 2 County 47 890841.
5 County 3 County 66 668010.
6 County 7 County 41 512246.
7 County 9 County 100 600399.
8 County 11 County 44 217320.
9 County 12 County 66 861757.
10 County 14 County 94 372178.
# … with 82 more rows
#一个tibble:92 x 3
起始目的地距离
1县1县27689265。
2县1县82 563744。
3县2县28463513。
4县2县47 890841。
5县3县66 668010。
6县7县41512246。
7县9县100 600399。
8县11县44 217320。
9县12县66 861757。
10县14县94372178。
#…还有82行
您可以随心所欲地轻松筛选县、距离、按县排列等信息。fuzzyjoin软件包内置了地理距离功能,可准确处理此信号:
if(!require(fuzzyjoin)){install.packages("fuzzyjoin");library(fuzzyjoin)}
#Loading required package: fuzzyjoin
df1 <- data.frame(lon=-88.40,lat=42.82)
df2 <- data.frame(lon = -88.40, lat= 42.82)
geo_join(df1,df2, max_dist=2)
# figured max_dist=2 would be ok if 1.5 were tol. on both lat and lon
#Joining by: c("lon", "lat")
# lon.x lat.x lon.y lat.y
#1 -88.4 42.82 -88.4 42.82
您要求的是左非等联接,即根据计算出的距离在县数据帧中查找位置在第二个数据帧中的匹配项。
df1 <- data.frame(lon=c(-88.40, 40),lat=c(42.82, 40));
df2 <- data.frame(lon = c(-88.40, 20), lat= c(42.82, 20))
> df1
lon lat
1 -88.4 42.82
2 40.0 40.00
> geo_join(df1,df2, max_dist=10)
Joining by: c("lon", "lat")
lon.x lat.x lon.y lat.y
1 -88.4 42.82 -88.4 42.82
> geo_left_join(df1,df2, max_dist=10)
Joining by: c("lon", "lat")
lon.x lat.x lon.y lat.y
1 -88.4 42.82 -88.4 42.82
2 40.0 40.00 NA NA
> geo_full_join(df1,df2, max_dist=10)
Joining by: c("lon", "lat")
lon.x lat.x lon.y lat.y
1 -88.4 42.82 -88.4 42.82
2 40.0 40.00 NA NA
3 NA NA 20.0 20.00