2015-10-02 3 views
2

У меня есть строки с именами состояний в них. Как эффективно их сокращать? Я знаю state.abb[grep("New York", state.name)], но это работает только в том случае, если «Нью-Йорк» - это целая строка. У меня, например, «Walmart, Нью-Йорк». Заранее спасибо!R: Сокращенные названия состояний в строках

Предположим, этот вход:

x = c("Walmart, New York", "Hobby Lobby (California)", "Sold in Sears in Illinois") 

Edit: желаемых результатов будет а-ля "Walmart, Нью-Йорк", "Hobby Lobby (CA)", "Проданный в Sears в IL". Как вы можете видеть здесь, состояние может проявляться по-разному в строке

+0

Каковы ваши ожидания? Получить «Walmart, N.Y.»? Но каковы предположения? –

+0

«Walmart, NY» в соответствии с соглашениями (и это то, что сделал бы 'state.abb', если он работал с полной строкой) –

+1

Мое предложение: Разделите свою строку на« первую часть »(только город?) И" государственная часть ". Сделайте сопоставление таблиц с полными именами состояний на аббревиатуры. Слияние. Не комбинируйте две части строки снова, потому что, почему бы вам? – Frank

ответ

5

Вот основа R способ, с помощью gregexpr(), regmatches() и regmatches<-(),:

abbreviateStateNames <- function(x) { 
    pat <- paste(state.name, collapse="|") 
    m <- gregexpr(pat, x) 
    ff <- function(x) state.abb[match(x, state.name)] 
    regmatches(x, m) <- lapply(regmatches(x, m), ff) 
    x 
} 

x <- c("Hobby Lobby (California)", 
     "Hello New York City, here I come (from Greensboro North Carolina)!") 

abbreviateStateNames(x) 
# [1] "Hobby Lobby (CA)"         
# [2] "Hello NY City, here I come (from Greensboro NC)!" 

В качестве альтернативы - и совсем немного больше естественно - вы можете сделать то же самое с помощью gsubfn пакет:

library(gsubfn) 

pat <- paste(state.name, collapse="|") 
gsubfn(pat, function(x) state.abb[match(x, state.name)], x) 
[1] "Hobby Lobby (CA)"         
[2] "Hello NY City, here I come (from Greensboro NC)!" 
+0

Это IT! Большое спасибо! –

+2

Вы не видите 'regmatches <-' каждый день. Хороший –