2015-10-02 30 views
2

我有其中包含狀態名稱的字符串。我如何高效地縮寫它們?我知道state.abb[grep("New York", state.name)],但只有在「紐約」是整個字符串的情況下才有效。例如,我有「紐約沃爾瑪」。提前致謝!R:字符串中的縮寫狀態名稱

假設此輸入:

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

編輯:理想的產出將是一拉 「沃爾瑪,NY」, 「業餘愛好大堂(CA)」, 「賣西爾斯在IL」。正如你可以從這裏看到,國家可以在一個字符串

+0

你有什麼期望: - 當然,你可以使用gsubfn包完成同樣的事情?要獲得「沃爾瑪,紐約州」?但是什麼是假設? –

+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)!" 

或者 - 和相當多的

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 <-'。好一個 –