R 查找两个美国邮政编码列之间的距离

标签 r tidyverse distance zipcode geosphere

我想知道使用 R 计算两个美国邮政编码列之间以英里为单位的距离的最有效方法是什么。

我听说过用于计算邮政编码之间差异的 geosphere 包,但并不完全理解它,想知道是否还有其他方法。

例如,假设我有一个如下所示的数据框。

 ZIP_START     ZIP_END
 95051         98053
 94534         94128
 60193         60666
 94591         73344
 94128         94128
 94015         73344
 94553         94128
 10994         7105
 95008         94128

我想创建一个如下所示的新数据框。

 ZIP_START     ZIP_END     MILES_DIFFERENCE
 95051         98053       x
 94534         94128       x
 60193         60666       x
 94591         73344       x
 94128         94128       x
 94015         73344       x
 94553         94128       x
 10994         7105        x
 95008         94128       x

其中 x 是两个邮政编码之间的英里差。

计算这个距离的最佳方法是什么?

这是创建示例数据框的 R 代码。

df <- data.frame("ZIP_START" = c(95051, 94534, 60193, 94591, 94128, 94015, 94553, 10994, 95008), "ZIP_END" = c(98053, 94128, 60666, 73344, 94128, 73344, 94128, 7105, 94128))

如果您有任何问题,请告诉我。

如有任何建议,我们将不胜感激。

感谢您的帮助。

最佳答案

有一个方便的 R 包,名为“zipcode”,它提供了一个包含邮政编码、城市、州以及纬度和经度的表格。因此,一旦获得该信息,“geosphere”包就可以计算点之间的距离。

library(zipcode)
library(geosphere)

#dataframe need to be character arrays or the else the leading zeros will be dropped causing errors
df <- data.frame("ZIP_START" = c(95051, 94534, 60193, 94591, 94128, 94015, 94553, 10994, 95008), 
       "ZIP_END" = c(98053, 94128, 60666, 73344, 94128, 73344, 94128, "07105", 94128), 
       stringsAsFactors = FALSE)

data("zipcode")

df$distance_meters<-apply(df, 1, function(x){
  startindex<-which(x[["ZIP_START"]]==zipcode$zip)
  endindex<-which(x[["ZIP_END"]]==zipcode$zip)
  distGeo(p1=c(zipcode[startindex, "longitude"], zipcode[startindex, "latitude"]), p2=c(zipcode[endindex, "longitude"], zipcode[endindex, "latitude"]))
})

关于输入数据框的列类的警告。邮政编码应该是字符而不是数字,否则前导零会被丢弃,从而导致错误。

distGeo 的返回距离以米为单位,我将允许读者确定正确的单位转换为英里。

更新
邮政编码包似乎已存档。有一个替换包:“zipcodeR”,它提供经度和纬度数据以及附加信息。

关于R 查找两个美国邮政编码列之间的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55408526/

相关文章:

r - 在 R 中按组组合行和列上的字符变量

R - 通过 ssh 连接并执行命令

r - 如何加快R中的文字搜索速度?

r - 将所有列转换为 data.frame 中的字符

r - 如何 pivot_long 对不匹配日期的 date-var 组合?

根据距离在点之间分配最佳值的算法

php - mysql 按第一列中的列排序

android - 是否有可能获得当前位置与街道、大道或区域之间的距离?

r - 如何使用缺失值执行 RMSE?

rename_with 但谓词基于其他变量中的值