Название государства к аббревиатуре в R - PullRequest
40 голосов
/ 24 марта 2011

У меня большой файл с переменным состоянием, который имеет полное имя состояния.Я хотел бы заменить его государственными сокращениями (то есть «Нью-Йорк» для «Нью-Йорк»).Есть ли простой способ сделать это (кроме использования нескольких команд if-else)?Может быть, использовать выражение "заменить"?Спасибо.

Ответы [ 5 ]

70 голосов
/ 24 марта 2011

R имеет две встроенные константы, которые могут помочь: state.abb с сокращениями и state.name с полными именами. Вот простой пример использования:

> x <- c("New York", "Virginia")
> state.abb[match(x,state.name)]
[1] "NY" "VA"
32 голосов
/ 24 марта 2011

1) grep полное имя из state.name и используйте его для индексации в state.abb:

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

1a) или с использованием which:

state.abb[which(state.name == "New York")]
## [1] "NY"

2) или создайте вектор сокращений состояний, имена которых являются полными именами, и внесите в него указатель, используя полное имя:

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

В отличие от (1), этот работает, даже если «Нью-Йорк» заменен вектором полных названий штатов, например setNames(state.abb, state.name)[c("New York", "Idaho")]

6 голосов
/ 09 июня 2015

Я обнаружил, что встроенные state.name и state.abb имеют только 50 состояний. Я получил большую таблицу (включая DC и т. Д.) Из сети (например, эту ссылку: http://www.infoplease.com/ipa/A0110468.html)) и вставил ее в файл .csv с именем States.csv. Затем я загружаю состояния и сокращения вместо этого файла использования встроенного. Остальное очень похоже на @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 ) ]

Существует небольшая разница между соответствием и совпадением в том, как они вычисляют расстояние от одного слова до другого. См. P25-26 здесь http://cran.r -project.org / doc / contrib / de_Jonge + van_der_Loo-Введение_to_data_cleaning_with_R.pdf

5 голосов
/ 14 марта 2018

Старый пост я знаю, но хотел бросить туда мой.Я учился на Tidyverse, так что, к лучшему или худшему, я избегаю базы R, когда это возможно.Я тоже хотел один с DC, поэтому сначала я построил пешеходный переход:

library(tidyverse)

 st_crosswalk <- tibble(state = state.name) %>%
   bind_cols(tibble(abb = state.abb)) %>% 
   bind_rows(tibble(state = "District of Columbia", abb = "DC"))

Затем я присоединил его к своим данным:

left_join(data, st_crosswalk, by = "state")
1 голос
/ 03 августа 2018

Вы также можете использовать base::abbreviate, если у вас нет названий штатов США.Это не даст вам одинаковые по размеру сокращения, если вы не увеличите минимальную длину.

state.name %>% base::abbreviate(minlength = 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...