如何基于纬度(30km近似匹配)合并两个R语言数据集?
基于30km范围内近似地理距离合并数据集的解决方案
问题原因说明
full_join是完全匹配合并,仅当Lat值完全相等时才会合并行,你的两个数据集Lat无完全匹配项,因此结果仅保留所有行并填充未匹配列的NA,无法实现近似合并。geo_join报错是因为未指定by参数,函数默认尝试用所有同名列(Var1、Var2、Lat、Lon)连接,但geo_join仅需经纬度两列作为连接依据,必须明确指定。
方法一:使用fuzzyjoin包实现地理近似合并
fuzzyjoin的geo_join专为地理距离匹配设计,可直接设置距离阈值并匹配最近点。
# 首次使用需安装包 install.packages("fuzzyjoin") library(fuzzyjoin) library(dplyr) # 调用geo_join:指定经纬度列、30km阈值,保留df所有行并匹配最近点 merged_df <- geo_join( df, df2, by = c("Lat" = "Lat", "Lon" = "Lon"), # 明确左右数据集的经纬度对应列 method = "haversine", # 采用球面距离计算公式 mode = "left", # 保留df的所有行 max_dist = 30, # 最大匹配距离30km distance_col = "distance_km" # 新增列存储实际匹配距离 ) # 若30km内存在多个匹配点,仅保留距离最近的行 merged_df <- merged_df %>% group_by(Lat.x, Lon.x) %>% # 按df的经纬度分组 filter(distance_km == min(distance_km)) %>% ungroup() # 查看结果 head(merged_df)
方法二:使用sf包进行空间连接
sf是专业空间数据处理包,适合复杂地理操作,精度更高。
# 首次使用需安装包 install.packages("sf") library(sf) # 将数据集转换为空间对象(WGS84坐标系,EPSG:4326) sf_df <- st_as_sf(df, coords = c("Lon", "Lat"), crs = 4326) sf_df2 <- st_as_sf(df2, coords = c("Lon", "Lat"), crs = 4326) # 转换为UTM平面坐标系(以米为单位,方便设置30km=30000米阈值,此处选对应区域的UTM带) sf_df_utm <- st_transform(sf_df, crs = 32606) sf_df2_utm <- st_transform(sf_df2, crs = 32606) # 空间最近邻连接,设置30km阈值 merged_sf <- st_nearest_join( sf_df_utm, sf_df2_utm, max_dist = 30000, # 最大距离30000米 left = TRUE # 保留sf_df的所有行 ) # 转换为普通数据框(可选,移除空间几何列) merged_df <- as.data.frame(merged_sf) %>% select(-geometry, -geometry.1)
内容的提问来源于stack exchange,提问作者L55
相关产品推荐
相关产品推荐

