2011-03-23 132 views
31

我有一個具有完整狀態名稱的變量狀態的大文件。我想用狀態縮寫(即「紐約」中的「NY」)替換它。有沒有簡單的方法來做到這一點(除了使用幾個if-else命令)?可能使用「替換」語句?謝謝。州名縮寫爲R

回答

23

1)grepstate.name的全名,並使用該索引到state.abb

state.abb[grep("New York", state.name)] 
## [1] "NY" 

2)或創建的州縮寫的向量其名稱是使用全名的全名和索引:

setNames(state.abb, state.name)["New York"] 
## New York 
##  "NY" 

與(1)不同,即使「紐約」被完整狀態名稱的向量(例如, setNames(state.abb, state.name)[c("New York", "Idaho")]

+0

這個工作當grep的第一個參數是一個字符串向量嗎? – user227290 2011-03-23 22:09:53

+1

不,在這種情況下,使用'match'來代替Aniko建議的'grep',或嘗試'setNames(state.abb,state.name)[c(「New York」,「Idaho」)]''。 – 2011-03-23 22:38:48

+0

謝謝,它澄清了這個問題。 – user227290 2011-03-24 21:09:35

56

R有兩個內置常量可能有幫助:state.abb帶有縮寫,state.name帶有全名。下面是一個簡單的使用例如:

> x <- c("New York", "Virginia") 
> state.abb[match(x,state.name)] 
[1] "NY" "VA" 
+0

非常感謝。這節省了我30分鐘的時間在R中編寫了50條if-else語句。 – user227290 2011-03-23 22:07:36

+5

@ user227290:如果你在考慮ifelse,那麼看看'?switch'可能是明智的。永遠不要知道它將來何時可能會派上用場。 – 2011-03-24 01:10:59

+0

假設華盛頓哥倫比亞特區被格式化爲哥倫比亞特區,我認爲'c(state.abb,'DC')[match(x,c(state.name,'哥倫比亞特區'))]'也可以工作 – sbha 2018-02-01 20:29:18

5

我發現內置的state.name和state.abb只有50個狀態。我從在線(例如,這個鏈接:http://www.infoplease.com/ipa/A0110468.html)得到了一張更大的表(包括DC等),並將其粘貼到名爲States.csv的.csv文件中。然後我加載狀態和縮寫。從這個文件而不是使用內置的。其餘的是神似@Aniko的

library(dplyr) 
library(stringr) 
library(stringdist) 

setwd() 
# load data 
data = c("NY", "New York", "NewYork") 
data = toupper(data) 

# load state name and abbr. 
State.data = read.csv('States.csv') 
State = toupper(State.data$State) 
Stateabb = as.vector(State.data$Abb) 

# match data with state names, misspell of 1 letter is allowed 
match = amatch(data, State, maxDist=1) 
data[ !is.na(match) ] = Stateabb[ na.omit(match) ] 

有一個在他們如何計算距離從一個詞到另一場比賽和amatch之間的微小差異。見這裏P25-26 http://cran.r-project.org/doc/contrib/de_Jonge+van_der_Loo-Introduction_to_data_cleaning_with_R.pdf