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

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

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

ПРОБЛЕМА:

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

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

ВОПРОС: Как сопоставить это с Боро?

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

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

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

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

[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", "БК-12", "БК-15", "БХ-12", "10467", "10029", "СИ-01", "36".
[51] "11232", "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".

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)

ЛЕВОЕ НАРУЖНОЕ СОЕДИНЕНИЕ с таблицей отображения на 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)

ЛЕВОЕ НАРУЖНОЕ СОЕДИНЕНИЕ с таблицей отображения на 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 в таблице сопоставления.

Другие вопросы по тегам