Необходимо идентифицировать состояния из смешанных имен / идентификаторов в данных о местоположении - PullRequest
0 голосов
/ 06 апреля 2020

Требуется идентифицировать состояния из смешанных данных о местоположении. Необходимо найти 50 сокращений штатов и 50 полных имен штатов и вернуть аббревиатуру состояний

N <- 1:10
Loc <- c("Los Angeles, CA", "Manhattan, NY", "Florida, USA", "Chicago, IL" , "Houston, TX",
+           "Texas, USA", "Corona, CA", "Georgia, USA", "WV NY NJ", "qwerty uy PO DOPL JKF" )
df <- data.frame(N, Loc)
> # Objective create variable state such 
> # state contains abbreviated names of states from Loc: 
> # for "Los Angeles, CA", state = CA
> # for "Florida, USA", sate = FL
> # for "WV NY NJ", state = NA
> # for "qwerty NJuy PO DOPL JKF", sate = NA (inspite of containing the srting NJ, it is not wrapped in spaces)
> 
# End result should be Newdf
State <- c("CA", "NY", "FL", "IL", "TX","TX", "CA", "GA", NA, NA)
Newdf <- data.frame(N, Loc, State)
> Newdf
    N                   Loc State
1   1       Los Angeles, CA    CA
2   2         Manhattan, NY    NY
3   3          Florida, USA    FL
4   4           Chicago, IL    IL
5   5           Houston, TX    TX
6   6            Texas, USA    TX
7   7            Corona, CA    CA
8   8          Georgia, USA    GA
9   9              WV NY NJ  <NA>
10 10 qwerty uy PO DOPL JKF  <NA>

Есть ли пакет? или можно все oop написать? Даже если бы схема могла быть продемонстрирована с несколькими состояниями, этого было бы достаточно - я опубликую полное решение, когда доберусь до нее. Кстати, это для набора данных Twitter, загруженного с помощью пакета rtweet, и переменная: place_full_name

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Есть константы по умолчанию в R, state.abb и state.name, которые можно использовать.

vars <-  stringr::str_extract(df$Loc, paste0('\\b',c(state.abb, state.name), 
                                             '\\b', collapse = '|'))
#[1] "CA"  "NY"  "Florida" "IL" "TX"  "Texas"  "CA" "Georgia" "WV"      NA   

Если вы хотите все как сокращения, мы можем go продвинуться дальше и сделать:

inds <- vars %in% state.name
vars[inds] <- state.abb[match(vars[inds], state.name)]
vars
#[1] "CA" "NY" "FL" "IL" "TX" "TX" "CA" "GA" "WV" NA

Однако мы можем видеть, что в 9-й строке вы ожидаете вывод как NA но здесь он возвращает "WV", потому что это имя штата. В таких случаях вам нужно подготовить достаточно строгие правила, чтобы он извлекал только имена состояний и ничего больше.

0 голосов
/ 06 апреля 2020

Используя встроенные константы R, state.abb и state.name, мы можем попытаться извлечь их из Loc с помощью регулярных выражений.

state.abbs <- sub('.+, ([A-Z]{2})', '\\1', df$Loc)
state.names <- sub('^(.+),.+', '\\1', df$Loc)

Теперь if Сокращения состояний нет ни одного из встроенных, тогда мы можем использовать match, чтобы найти позиции нашего state.names, которые находятся в любом из элементов во встроенном векторе state.name, и использовать это для индексации state.abb, else сохраните то, что у нас уже есть. Те, которые не совпадают, возвращают NA.

df$state.abb <- ifelse(!state.abbs %in% state.abb, 
                       state.abb[match(state.names, state.name)], state.abbs)
df
    N                   Loc state.abb
1   1       Los Angeles, CA        CA
2   2         Manhattan, NY        NY
3   3          Florida, USA        FL
4   4           Chicago, IL        IL
5   5           Houston, TX        TX
6   6            Texas, USA        TX
7   7            Corona, CA        CA
8   8          Georgia, USA        GA
9   9              WV NY NJ      <NA>
10 10 qwerty uy PO DOPL JKF      <NA>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...