如何依据经纬度前4位合并两个精度不同的Data Frame
R语言:基于经纬度前4位匹配合并DataFrame
我有两个包含纬度(Latitude)、经度(Longitude)和速度(Speed)字段的数据框:DF1的经纬度保留三位小数,DF2的经纬度保留五位小数。需要依据经纬度值的前4位数字合并两者,仅保留经纬度前4位匹配的记录;合并结果要保留DF2的完整经纬度值,并整合双方的Speed字段,不匹配的记录直接忽略。
示例数据
DF1
| A_Lat | A_Long | A_Speed |
|---|---|---|
| 5.667 | 2.443 | 1345 |
对应的R构造代码:
DF1 <- structure(list(A_Lat = c(5.667, 5.667, 5.667, 5.667, 5.663, 5.662 ), A_Long = c(2.443, 2.445, 2.445, 2.445, 2.445, 2.445), A_Speed = c(1345L, 3551L, 3551L, 3551L, 3551L, 3551L)), class = "data.frame", row.names = c(NA, 6L))
DF2
| B_Lat | B_Long | B_Speed |
|---|---|---|
| 5.66781 | 2.44323 | 2345 |
对应的R构造代码:
DF2 <- structure(list(B_Lat = c(5.66781, 5.66783, 5.66743, 5.66723, 5.66734, 5.66712), B_Long = c(2.44323, 2.44534, 2.44523, 2.44512, 2.44512, 2.44543), B_Speed = c(2345L, 4551L, 5551L, 7551L, 7551L, 8551L)), class = "data.frame", row.names = c(NA, 6L))
期望合并结果
| R_Lat | R_Long | R_B_Speed | R_A_Speed |
|---|---|---|---|
| 5.66781 | 2.44323 | 2345 | 1345 |
解决方案
核心思路是先为两个数据框生成用于匹配的经纬度前4位标识,再基于这些标识进行内连接(仅保留匹配记录),最后整理结果格式。
完整实现代码
# 加载数据 DF1 <- structure(list(A_Lat = c(5.667, 5.667, 5.667, 5.667, 5.663, 5.662 ), A_Long = c(2.443, 2.445, 2.445, 2.445, 2.445, 2.445), A_Speed = c(1345L, 3551L, 3551L, 3551L, 3551L, 3551L)), class = "data.frame", row.names = c(NA, 6L)) DF2 <- structure(list(B_Lat = c(5.66781, 5.66783, 5.66743, 5.66723, 5.66734, 5.66712), B_Long = c(2.44323, 2.44534, 2.44523, 2.44512, 2.44512, 2.44543), B_Speed = c(2345L, 4551L, 5551L, 7551L, 7551L, 8551L)), class = "data.frame", row.names = c(NA, 6L)) # 生成匹配用的经纬度前4位字段(转字符串提取,避免浮点精度问题) DF1$match_lat <- substr(as.character(DF1$A_Lat), 1, 4) DF1$match_long <- substr(as.character(DF1$A_Long), 1, 4) DF2$match_lat <- substr(as.character(DF2$B_Lat), 1, 4) DF2$match_long <- substr(as.character(DF2$B_Long), 1, 4) # 基于匹配字段做内连接 merged_df <- merge(DF2, DF1, by = c("match_lat", "match_long"), all = FALSE) # 整理结果字段并重命名 result_df <- merged_df[, c("B_Lat", "B_Long", "B_Speed", "A_Speed")] names(result_df) <- c("R_Lat", "R_Long", "R_B_Speed", "R_A_Speed") # 输出结果 print(result_df)
代码说明
- 生成匹配字段:将经纬度转为字符串后提取前4位(包含小数点),避免直接用数学运算可能带来的浮点精度误差。
- 内连接合并:使用
merge()的all=FALSE参数,仅保留经纬度前4位同时匹配的记录。 - 结果整理:筛选需要的字段并重命名为期望的格式,保留DF2的完整经纬度值。
运行上述代码后,将得到与示例一致的合并结果。
内容的提问来源于stack exchange,提问作者Usman YousafZai
相关产品推荐
相关产品推荐

