R语言如何基于经纬度合并坐标相近的两个DataFrame数据集
问题场景
现有公开可查的经纬度数据合并方案,大多针对两个数据框经纬度存在偏差的场景,通过计算点位空间距离实现最近邻匹配,不适用于经纬度精确对应、点位一一匹配的场景:
- df1存储河流沿线点位的流量(体积流量)数据,包含纬度
Lat、经度Lon、流量Q三个字段,示例数据如下:
df1 <- data.frame(Lat = c(2,4,1,2,5), Lon = c(6,7,8,9,8), Q = c(150, 120, 80, 95, 100))
- df2存储同批次河流点位的治理相关数据,包含纬度
Lat、经度Lon、治理指标T三个字段,示例数据如下:
df2 <- data.frame(Lat = c(2,4,1,2,5), Lon = c(6,7,8,9,8), T = c(17, 12, 8, 9, 10))
需要按经纬度字段匹配关联两个数据框,预期输出结果如下:
Lat Long Q T 2 6 150 17 4 7 120 12 1 8 80 8 2 9 95 9 5 8 100 10
实现方案
由于两个表的经纬度为精确匹配关系,直接使用等值连接即可,无需引入复杂的空间距离计算逻辑,两种常用实现方式如下:
方法1:base R 原生实现
无需加载第三方包,直接用内置merge函数指定经纬度为连接键,最后调整列名、列顺序和预期输出对齐即可:
# 按经纬度等值连接 merge_res <- merge(df1, df2, by = c("Lat", "Lon")) # 调整列顺序、将Lon重命名为Long merge_res <- setNames(merge_res[, c("Lat", "Lon", "Q", "T")], c("Lat", "Long", "Q", "T"))
运行后输出的merge_res和预期结果完全一致。
方法2:dplyr 实现
如果习惯使用tidyverse语法,可调用inner_join实现连接,代码可读性更高、大数据量下运行速度更快:
library(dplyr) merge_res <- df1 %>% inner_join(df2, by = c("Lat", "Lon")) %>% select(Lat, Long = Lon, Q, T)
注意:如果实际采集的经纬度存在极小的浮点精度误差(比如GPS采集值偏差在1e-6级别),可先对经纬度字段四舍五入保留固定小数位后再做等值连接,相比距离匹配方案运行效率高数个量级,也不会出现点位错配问题。
内容的提问来源于stack exchange,提问作者Xaviermoros
相关产品推荐
相关产品推荐

