2011-03-23 8 views
31

Tengo un archivo grande con un estado variable que tiene el nombre de estado completo. Me gustaría reemplazarlo con las abreviaturas del estado (que es "NY" para "Nueva York"). ¿Hay una manera fácil de hacer esto (aparte de usar varios comandos if-else)? ¿Puede estar usando la declaración "reemplazar"? Gracias.Nombre del estado abreviado en R

Respuesta

23

1)grep el nombre completo de state.name y el uso que para indexar en state.abb:

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

2) o crear un vector de abreviaturas de los estados cuyos nombres son los nombres completos y el índice con el nombre completo:

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

A diferencia de (1), este funciona incluso si "Nueva York" se reemplaza por un vector de nombres de estado completo, p. setNames(state.abb, state.name)[c("New York", "Idaho")]

+0

este trabajo cuando el primer argumento de grep es un vector de cadena? – user227290

+1

No, en ese caso use 'match' en lugar de' grep' como lo sugiere Aniko o intente 'setNames (state.abb, state.name) [c (" New York "," Idaho ")]'. –

+0

Gracias, aclara el problema. – user227290

56

R tiene dos constantes integradas que pueden ayudar: state.abb con las abreviaturas, y state.name con los nombres completos. Este es un ejemplo de uso simple:

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

Muchas gracias. Esto me ahorró 30 minutos de escribir 50 declaraciones de if-else en R. – user227290

+5

@ user227290: si pensabas en ifelse, podría ser inteligente mirar '? Switch' Nunca se sabe cuándo podría ser útil en el futuro. –

+0

Suponiendo que Washington DC tiene el formato 'Distrito de Columbia', creo que 'c (state.abb, 'DC') [match (x, c (state.name, 'District of Columbia'))]' también funciona – sbha

5

Encontré que el state.name y el state.abb integrados solo tienen 50 estados. Obtuve una tabla más grande (incluyendo DC, etc.) en línea (por ejemplo, este enlace: http://www.infoplease.com/ipa/A0110468.html) y la pegué en un archivo .csv llamado States.csv. Luego cargo estados y abbr. de este archivo en lugar de usar el built-in. El resto es bastante similar a @Aniko 's

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) ] 

Hay una pequeña diferencia entre partido y amatch en forma de calcular la distancia de una palabra a otra. Ver P25-26 aquí http://cran.r-project.org/doc/contrib/de_Jonge+van_der_Loo-Introduction_to_data_cleaning_with_R.pdf

Cuestiones relacionadas