R Найти расстояние между двумя столбцами почтового индекса США - PullRequest
1 голос
/ 29 марта 2019

Мне было интересно, какой самый эффективный метод вычисления расстояния в милях между двумя столбцами почтового индекса США будет использовать 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 Ответ

4 голосов
/ 29 марта 2019

Существует удобный R-пакет с именем "zipcode", который предоставляет таблицу почтового индекса, города, штата, а также широты и долготы. Таким образом, когда у вас есть эта информация, пакет «геосфера» может рассчитать расстояние между точками.

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 указано в метрах, я позволю читателю определить правильное преобразование единиц в мили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...