You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于纬度(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 18:07:51