【发布时间】:2011-03-23 21:41:38
【问题描述】:
我有一个带有变量state 的大文件,该变量具有完整的状态名称。我想将其替换为州缩写(即“纽约”的“NY”)。有没有一种简单的方法可以做到这一点(除了使用几个 if-else 命令)?可能是使用replace() 声明?
【问题讨论】:
标签: r
我有一个带有变量state 的大文件,该变量具有完整的状态名称。我想将其替换为州缩写(即“纽约”的“NY”)。有没有一种简单的方法可以做到这一点(除了使用几个 if-else 命令)?可能是使用replace() 声明?
【问题讨论】:
标签: r
R 有两个可能有帮助的内置常量:state.abb 带有缩写,state.name 带有全名。下面是一个简单的用法示例:
> x <- c("New York", "Virginia")
> state.abb[match(x,state.name)]
[1] "NY" "VA"
【讨论】:
?switch 可能是明智之举,永远不知道将来什么时候会派上用场。
c(state.abb, 'DC')[match(x, c(state.name, 'District of Columbia'))] 也可以
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")]
【讨论】:
match 代替 Aniko 建议的 grep 或尝试 setNames(state.abb, state.name)[c("New York", "Idaho")]。
state.name 的一部分,比如“illinois”的“ill”?当模式是实际state.name 的子字符串时,是否有解决方案?
我发现内置的 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 ) ]
match 和 amatch 在计算一个词到另一个词的距离方面存在细微差别。请参阅此处的 P25-26 http://cran.r-project.org/doc/contrib/de_Jonge+van_der_Loo-Introduction_to_data_cleaning_with_R.pdf
【讨论】:
我知道的旧帖子,但想把我的扔在那里。我在 tidyverse 上学习过,所以无论好坏,我都会尽可能避免使用 base 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")
【讨论】:
如果您没有美国州名,也可以使用 base::abbreviate。除非您增加 minlength,否则这不会给您同样大小的缩写。
state.name %>% base::abbreviate(minlength = 1)
【讨论】:
如果您必须经常将州名称与缩写匹配或其他方式匹配,您可以将 Aniko 的解决方案放在 .Rprofile 或包中的函数中:
state_to_st <- function(x){
c(state.abb, 'DC')[match(x, c(state.name, 'District of Columbia'))]
}
st_to_state <- function(x){
c(state.name, 'District of Columbia')[match(x, c(state.abb, 'DC'))]
}
将该函数用作 dplyr 链的一部分:
enframe(state.name, value = 'state_name') %>%
mutate(state_abbr = state_to_st(state_name))
【讨论】: