首页 > 解决方案 > R:如何从纽约市邮政编码的特定列中创建一个包含正确行政区的新列?

问题描述

这是我的第一个问题,我在网上找不到答案..

我想对纽约市 5 个行政区的绝对病例数进行统计。

问题:

我在 R 的数据框中有一列,这是不整洁的。它应该只包含每个案例的纽约市行政区。但它混合了 250 多个案例,它们是以下 3 个案例之一:

  1. 邮政编码是布朗克斯、布鲁克林、曼哈顿、皇后区或史泰登岛。
  2. 诸如布朗克斯的“bx-12345”、皇后区的“qu-23452”、曼哈顿(...)的“ma-23412”和
  3. 一半的案例确实是“布朗克斯”、“布鲁克林”、“曼哈顿”(...)。无需更改它。

问题:如何与自治市镇匹配?

我有每个自治市镇的邮政编码列表。

  1. 如何与匹配的行政区交换邮政编码?

  2. 如何获取字符串的前 2 个字母'BX''BX-12345'匹配所有自治市镇?

来自 df 的示例:

[1] “BK-14” “QN-12” “BX-12” “SI-01” “BX-03” “11216” “SI-01” “BX-05” “11249” “42”
[11] “10009” “QN-05” “10453” “10453” “10453” “10453” “10453” “10453” “10453” “10457”
[21] “10458” “BX-04” “10453” “10453” “ 10453“10453”“10467”“QN-07”“10029”“10028”
[31]“11221”“10452”“11206”“曼哈顿”“曼哈顿”“36”“11212”“曼哈顿”“10032”“10459”
[41]“10459”“10459”“10459”“BK-12”“BK-15”“BX-12”“10467”“10029”“SI-01”“36”
[51] “11232” “11206” “10002” “10455” “10455” “11239” “11239” “11239” “11239” “11239”“11206” “10002” “10455” “10455” “11239” “11239” “11239” “11239” “11239”“11206” “10002” “10455” “10455” “11239” “11239” “11239” “11239” “11239”
[61] “11239” “11239” “11239” “SI-03” “11239” “11239” “11239” “11239” “11239” “11239”
[71] “11239” “11239” “11239” “11239” “11239” “11239” “10459” “10455” “10468” “11216”
[81] “11249” “10460” “布鲁克林” “11206” “11238” “10459” “11206” “11206” “10468” “10468” “
[91] “10002” “10456” “SI-01” “QN-08” “BX-09” “10022” “11691”“曼哈顿”“曼哈顿”“BX-07”

标签: rstatisticsnycbrooklyn

解决方案


考虑一个带有不整洁行政区的 data.frame:

df <- data.frame(borough = c("12345", "BX-12345", "Bronx"), stringsAsFactors = FALSE)
df
#>    borough
#> 1    12345
#> 2 BX-12345
#> 3    Bronx

和一个映射表:

map <- data.frame(zip = "12345", abbr = "BX", name = "Bronx", stringsAsFactors = FALSE)
map
#>     zip abbr  name
#> 1 12345   BX Bronx

首先将“abbr-zip”简化为“abbr”:

df$borough <- gsub("^([^-]*)-.*$", "\\1", df$borough)

LEFT OUTER JOIN 与映射表 on zip,接受所有匹配值:

df1 <- merge(df, map, by.x = "borough", by.y = "zip", all.x = TRUE)
df$borough <- ifelse(is.na(df1$name), df1$borough, df1$name)

LEFT OUTER JOIN 与映射表 on abbr,接受所有匹配值:

df2 <- merge(df, map, by.x = "borough", by.y = "abbr", all.x = TRUE)
df$borough <- ifelse(is.na(df2$name), df2$borough, df2$name)

结果:

df
#>   borough
#> 1   Bronx
#> 2   Bronx
#> 3   Bronx

实际上将“abbr-zip”映射到“zip”更简单

df$borough <- gsub("^[^-]*-(.*)*$", "\\1", df$borough)

之后,第一个 LEFT OUTER JOIN 就足够了。而且你不需要abbr在映射表中。


推荐阅读