Р: Как сделать из определенного столбца почтовых индексов Нью-Йорка новый столбец с нужными районами?

Это мой первый вопрос, и я не мог найти ответ в Интернете.

Я хочу составить статистику абсолютного числа случаев в 5 районах Нью-Йорка.

ПРОБЛЕМА:

У меня есть столбец во фрейме данных в R, который неаккуратный. Он должен содержать только районы Нью-Йорка для каждого случая. Но это смешано из 250+ случаев, которые являются одним из 3 ниже:

  1. Почтовые индексы: Бронкс, Бруклин, Манхэттен, Квинс или Статен-Айленд.
  2. сокращения, такие как «bx-12345» для Бронкса, «qu-23452» для Квинса, «ma-23412» для Манхэттена (...) и
  3. половина дел действительно «Бронкс», «Бруклин», «Манхэттен» (...). Нет необходимости менять его.

ВОПРОС: как сопоставить его с районом?

У меня есть список почтовых индексов каждого района.

  1. Как я могу поменять почтовые индексы с соответствующим районом?

  2. Как я могу взять первые 2 буквы строки, например 'BX', в 'BX-12345', чтобы они соответствовали всем районам?

Примеры из ДФ:

[1] «БК-14» «QN-12» «БХ-12» «СИ-01» «БХ-03» «11216» «СИ-01» «БХ-05» «11249» «42»
[11] "10009" "QN-05" "10453" "10453" "10453" "10453" "10453" "10453" "10453" "10457"
[21] "10458" "ВХ-04" " 10453" "10453" "10453" "10453" "10467" "QN-07" "10029" "10028"
[31] "11221" "10452" "11206" "Манхэттен" "Манхэттен" "36" " 11212" "Манхэттен" "10032" "10459"
[41] "10459" "10459" "10459" "БК-12" "БК-15" "БХ-12" "10467" "10029" "SI- 01" "36"
[51] "11232" "11206" "10002" "10455" "10455" "11239" "11239" "11239" "11239" "11239"
[61] "11239" "11239" "11239" "СИ-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»


person J. T. Random    schedule 07.08.2018    source источник


Ответы (1)


Рассмотрим 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 с таблицей сопоставления на 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 с таблицей сопоставления на 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 в таблице отображения.

person Ralf Stubner    schedule 07.08.2018