将邮政编码Map到R中各自的城市和州?

ccgok5k5  于 2023-02-17  发布在  其他
关注(0)|答案(4)|浏览(352)

我有一个邮政编码的数据框架,我希望Map到一个城市和国家的每一个特定的邮政编码。目前,我已经发挥了邮政编码包有点,但我不确定是否可以解决这个特定的问题。
以下是我目前掌握的一些数据样本:

str(all_key$zip)
chr [1:406] "43031" "24517" "43224" "43832" "53022" "60185" "84104" "43081" 
"85226" "85193" "54656" "43215" "94533" "95826" "64804" "49548" "54467"

预期的输出将是在数据框的每一行中添加一个城市和州列,以引用各个邮政编码:

head(all_key)
     zip city  state
1   43031 city1 state1
2   24517 city2 state2
3   43224 city3 state3
4   43832 city4 state4
5   53022 city5 state5
6   60185 city6 state6

先谢谢你的帮助。

sqxo8psd

sqxo8psd1#

另一项更新-2023年2月

另一个软件包(zipcodeR)已经被添加,使这变得更容易。

答案更新-2020年1月

邮政编码包似乎已经消失了,所以这个答案已经更新,以显示如何从外部文件添加lat-lon。

原始答案

您可以从zipcode包中获取数据,然后进行合并以查找数据。

zip = c("43031", "24517", "43224", "43832", "53022", 
 "60185", "84104", "43081", "85226", "85193", "54656", 
 "43215", "94533", "95826", "64804", "49548", "54467")
ZC = data.frame(zip)

library(zipcode)
data(zipcode)
merge(ZC, zipcode)
     zip           city state latitude  longitude
1  24517      Altavista    VA 37.12754  -79.27409
2  43031      Johnstown    OH 40.15198  -82.66944
3  43081    Westerville    OH 40.10951  -82.91606
4  43215       Columbus    OH 39.96513  -83.00431
5  43224       Columbus    OH 40.03991  -82.96772
6  43832  Newcomerstown    OH 40.27738  -81.59662
7  49548   Grand Rapids    MI 42.86823  -85.66391
8  53022     Germantown    WI 43.21916  -88.12043
9  54467         Plover    WI 44.45228  -89.54399
10 54656         Sparta    WI 43.96977  -90.80796
11 60185   West Chicago    IL 41.89198  -88.20502
12 64804         Joplin    MO 37.04716  -94.51124
13 84104 Salt Lake City    UT 40.75063 -111.94077
14 85193    Casa Grande    AZ 32.86000 -111.83000
15 85226       Chandler    AZ 33.31221 -111.93177
16 94533      Fairfield    CA 38.26958 -122.03701
17 95826     Sacramento    CA 38.55010 -121.37492

如果需要保持行的顺序相同,可以只设置邮政编码数据的行名称,然后使用它来选择所需的行和列。

rownames(zipcode) = zipcode$zip
zipcode[zip, 1:3]
        zip           city state
43031 43031      Johnstown    OH
24517 24517      Altavista    VA
43224 43224       Columbus    OH
43832 43832  Newcomerstown    OH
53022 53022     Germantown    WI
60185 60185   West Chicago    IL
84104 84104 Salt Lake City    UT
43081 43081    Westerville    OH
85226 85226       Chandler    AZ
85193 85193    Casa Grande    AZ
54656 54656         Sparta    WI
43215 43215       Columbus    OH
94533 94533      Fairfield    CA
95826 95826     Sacramento    CA
64804 64804         Joplin    MO
49548 49548   Grand Rapids    MI
54467 54467         Plover    WI

更新答案-2020年1月

因为zipcode包已经消失了,所以这里展示了如何从下载的数据集中添加lat-lon信息。我正在使用的文件 * 今天 * 就存在了,但是这个方法应该可以用于其他文件。请参阅GIS StackExchange以获得一些关于在哪里下载数据的线索。

## Original Data to match
zip = c("43031", "24517", "43224", "43832", "53022", 
 "60185", "84104", "43081", "85226", "85193", "54656", 
 "43215", "94533", "95826", "64804", "49548", "54467")
ZC = data.frame(zip)

## Download source file, unzip and extract into table
ZipCodeSourceFile = "http://download.geonames.org/export/zip/US.zip"
temp <- tempfile()
download.file(ZipCodeSourceFile , temp)
ZipCodes <- read.table(unz(temp, "US.txt"), sep="\t")
unlink(temp)
names(ZipCodes) = c("CountryCode", "zip", "PlaceName", 
"AdminName1", "AdminCode1", "AdminName2", "AdminCode2", 
"AdminName3", "AdminCode3", "latitude", "longitude", "accuracy")

## merge extra info onto original data
fZC_Info = merge(ZC, ZipCodes[,c(2:6,10:11)])
head(ZC_Info)
    zip     PlaceName AdminName1 AdminCode1 AdminName2 latitude longitude
1 24517     Altavista   Virginia         VA   Campbell  37.1222  -79.2911
2 43031     Johnstown       Ohio         OH    Licking  40.1445  -82.6973
3 43081   Westerville       Ohio         OH   Franklin  40.1146  -82.9105
4 43215      Columbus       Ohio         OH   Franklin  39.9671  -83.0044
5 43224      Columbus       Ohio         OH   Franklin  40.0425  -82.9689
6 43832 Newcomerstown       Ohio         OH Tuscarawas  40.2739  -81.5940

第二次更新-2023年2月

另一个软件包zipcodeR使这一点变得更容易,下面是一些简单的代码来演示它。

library(zipcodeR)

zip = c("43031", "24517", "43224", "43832", "53022", 
 "60185", "84104", "43081", "85226", "85193", "54656", 
 "43215", "94533", "95826", "64804", "49548", "54467")

reverse_zipcode(zip)[,c(1,3,7)]
# A tibble: 17 × 3
   zipcode major_city     state
   <chr>   <chr>          <chr>
 1 85193   Casa Grande    AZ   
 2 85226   Chandler       AZ   
 3 94533   Fairfield      CA   
 4 95826   Sacramento     CA   
 5 60185   West Chicago   IL   
 6 49548   Grand Rapids   MI   
 7 64804   Joplin         MO   
 8 43031   Johnstown      OH   
 9 43081   Westerville    OH   
10 43215   Columbus       OH   
11 43224   Columbus       OH   
12 43832   Newcomerstown  OH   
13 84104   Salt Lake City UT   
14 24517   Altavista      VA   
15 53022   Germantown     WI   
16 54467   Plover         WI   
17 54656   Sparta         WI
cidc1ykv

cidc1ykv2#

您仍然可以通过从归档文件https://cran.r-project.org/src/contrib/Archive/zipcode/下载来使用“zipcode”包
下载tar. gz文件到您的计算机后,您可以从RStudio GUI Packages窗格安装它。单击“Install”后,您可以将选项更改为“Package Archive File”并指向下载的tar. gz文件。

fdx2calv

fdx2calv3#

安装/使用USA package,也就是described here,它包含来自归档的邮政编码包的tibble(zips和lats/long)。

library(usa)
zcs <- usa::zipcodes
head(zcs)

# A tibble: 6 x 5
  zip   city       state   lat  long
  <chr> <chr>      <chr> <dbl> <dbl>
1 00210 Portsmouth NH     43.0 -71.0
2 00211 Portsmouth NH     43.0 -71.0
3 00212 Portsmouth NH     43.0 -71.0
4 00213 Portsmouth NH     43.0 -71.0
5 00214 Portsmouth NH     43.0 -71.0
6 00215 Portsmouth NH     43.0 -71.0
qv7cva1a

qv7cva1a4#

可以使用R包zipcodeR中的 Dataframe 。
要将城市和州添加到数据框中,您可以从zipcodeR提供的数据框(称为zip_code_db)中选择所需变量,然后将其与数据框连接:

library(dplyr)
library(zipcodeR)

zip_code_db_selected =
  zip_code_db %>% 
  select(zipcode, major_city, state)

all_key_with_city_st = 
  left_join(all_key, zip_code_db_selected, by = c("zip" = "zipcode"))

相关问题