R语言中不同数据框间坐标匹配与距离计算代码验证
R语言中为final数据框添加经纬度列的判断与正确写法
由于你没提供当前使用的添加列代码,没法直接判定对错,但结合你的场景,可以给出靠谱的实现方式,以及常见的错误坑:
场景前提
你有两个带纽约经纬度的数据框df_1(已去重得到df_1_unique)、df_2,通过嵌套循环计算df_1_unique每个坐标与df_2所有坐标的distHaversine地理距离,得到了final数据框,现在要给它补上long_1、lat_1(来自df_1_unique)和long_2、lat_2(来自df_2)四列。
正确实现方式
方法1:循环时直接记录经纬度(最稳妥)
别等循环完再补,计算距离的时候就把对应经纬度一起存,完全避免匹配错误:
library(geosphere) # 先对df_1去重 df_1_unique <- unique(df_1) # 初始化空列表存结果 result_list <- list() # 嵌套循环计算+存数据 for (i in 1:nrow(df_1_unique)) { # 取出df_1当前行的经纬度 curr_long1 <- df_1_unique$long[i] curr_lat1 <- df_1_unique$lat[i] for (j in 1:nrow(df_2)) { # 取出df_2当前行的经纬度 curr_long2 <- df_2$long[j] curr_lat2 <- df_2$lat[j] # 计算哈维正弦距离 curr_dist <- distHaversine(c(curr_long1, curr_lat1), c(curr_long2, curr_lat2)) # 把当前所有信息存成小数据框,加入列表 result_list[[length(result_list)+1]] <- data.frame( long_1 = curr_long1, lat_1 = curr_lat1, long_2 = curr_long2, lat_2 = curr_lat2, distance = curr_dist ) } } # 把列表合并成final数据框 final <- do.call(rbind, result_list)
方法2:给已有的final补加列
如果你的final已经生成,且行顺序严格是df_1_unique每行对应df_2所有行(比如先处理df_1_unique第1行,遍历完df_2所有行,再处理df_1_unique第2行),可以用重复行的方式匹配:
# 假设df_1_unique有n行,df_2有m行,final的行数一定是n*m final$long_1 <- rep(df_1_unique$long, each = nrow(df_2)) final$lat_1 <- rep(df_1_unique$lat, each = nrow(df_2)) final$long_2 <- rep(df_2$long, times = nrow(df_1_unique)) final$lat_2 <- rep(df_2$lat, times = nrow(df_1_unique))
常见错误点
如果你的代码出问题,大概率是这几个原因:
- 用错了
rep()的参数:把each和times搞反,导致经纬度匹配错位 df_1去重后,循环时还是用了原df_1的索引,导致经纬度和final的行不对应final的行顺序和循环时的遍历顺序不一致,补列时自然匹配错误
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

