Р: Как сделать из определенной колонки почтовых индексов Нью-Йорка новую колонку с нужными районами?
Это мой первый вопрос, и я не смог найти ответ в сети..
Я хочу сделать статистику абсолютного количества случаев в 5 районах Нью-Йорка.
ПРОБЛЕМА:
У меня есть столбец в кадре данных в R, который неопрятный. Он должен содержать только районы Нью-Йорка для каждого случая. Но он состоит из 250+ случаев, которые являются одним из 3 ниже:
- Почтовые индексы: Бронкс, Бруклин, Манхэттен, Квинс или Статен-Айленд.
- такие сокращения, как "bx-12345" для Бронкса, "qu-23452" для Квинса, "ma-23412" для Манхэттена (...) и
- половина случаев - это "Бронкс", "Бруклин", "Манхэттен" (...). Не нужно его менять.
ВОПРОС: Как сопоставить это с Боро?
У меня есть список почтовых индексов каждого района.
Как я могу обменять почтовые индексы с соответствующим районом?
Как я могу взять первые 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
в таблице сопоставления.