代码之家  ›  专栏  ›  技术社区  ›  mrsquid

r找到两个美国邮政编码列之间的距离

  •  0
  • mrsquid  · 技术社区  · 6 年前

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

    我听说过用于计算压缩码之间差异的地球圈软件包,但我不完全理解它,我想知道是否还有其他的方法。

    例如,假设我有一个像这样的数据帧。

     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))
    

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

    感谢您的任何建议。

    谢谢你的帮助。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Dave2e    6 年前

    有一个名为“zip code”的方便的r包,它提供了一个包含邮政编码、城市、州和经度的表。所以一旦你有了这些信息,“地球圈”软件包就可以计算出点之间的距离。

    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的返回距离以米为单位,我将允许读者确定正确的单位转换为英里。