r - R:如何从纽约市邮政编码的特定列中创建一个包含正确行政区的新列?
问题描述
这是我的第一个问题,我在网上找不到答案..
我想对纽约市 5 个行政区的绝对病例数进行统计。
问题:
我在 R 的数据框中有一列,这是不整洁的。它应该只包含每个案例的纽约市行政区。但它混合了 250 多个案例,它们是以下 3 个案例之一:
- 邮政编码是布朗克斯、布鲁克林、曼哈顿、皇后区或史泰登岛。
- 诸如布朗克斯的“bx-12345”、皇后区的“qu-23452”、曼哈顿(...)的“ma-23412”和
- 一半的案例确实是“布朗克斯”、“布鲁克林”、“曼哈顿”(...)。无需更改它。
问题:如何与自治市镇匹配?
我有每个自治市镇的邮政编码列表。
如何与匹配的行政区交换邮政编码?
如何获取字符串的前 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”
解决方案
考虑一个带有不整洁行政区的 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
在映射表中。
推荐阅读
- javascript - jQuery如何重复动画
- mysql - NodeJS获取mysql查询结果
- logging - 如何在独白中使用 DeduplicationHandler?
- sql - 查询:emps 数量最高的部门名称,错误:无法对包含聚合或子查询的表达式执行聚合函数
- javascript - Redux 多次分派动作,即使它只在一个函数中分派一次
- sql - 访问:删除查询要求一个参数
- css - 如何在输入文本元素中添加日历图标
- swiftui - 如何使用 SwiftUi 导入 FSCalendar?
- javascript - 斐波那契发生器没有给出正确的结果
- java - 如何用显示的内容替换波斯 Unicode 字符?