使用grep将州名转换为缩写

时间:2018-04-19 18:53:43

标签: r if-statement grep paste

我的问题与此类似,但不同:

State name to abbreviation in R

我有一个状态名称的向量,如下所示:

/mnt/lustre

上面向量中的每个条目对应于 bs <- c("texas", "tex", "calif", "wisc", "mass", "miss", "oh", "ohio", "colo", "fla") 的州名。问题是state.name中的条目没有标准化。我想使用bs作为输入向量,并从bs返回相应的州缩写。以下代码有点但不是我想要的方式。

state.abb

它返回:

state.abb[grep(paste(bs, collapse = "|"), state.name, ignore.case = T)]

这只是UNIQUE州的缩写。我想要的是:

"CA" "CO" "MA" "MS" "MO" "OH" "TX" "WI"

显然我在这里遗漏了一些东西。我想知道是否有人有任何建议。任何帮助将非常感激。

此问题已从先前版本更新。

2 个答案:

答案 0 :(得分:1)

使用base R你可以做类似的事情:

a=nchar(state)>2 # Find those that have not been abbreviated yet:

现在你需要获得它们相似的变换矩阵。即与r。

中给出的state.name的最小距离
b=attr(adist(state.name,state[a],counts=T,ignore.case = T),"trafos")

使用变换矩阵,编写一个函数来获得具有最大相似性的函数,并将其替换为状态向量:

fun=function(x) which.max(nchar(gsub("(^M+).*|.*","\\1",x)))
replace(state,a, tolower(state.abb[apply(b,2,fun)]))
[1] "va" "fl" "ca" "tx" "me" "ny" "il" "in" "ri" "az" "oh"

答案 1 :(得分:0)

首先,我认为你可以采取每个州的前2个字符。对于大多数州来说就足够了。

> df$state_final <- substr(df$state, 1 , 2)
> df$state_final
 [1] "va" "fl" "ca" "te" "ma" "ny" "il" "in" "ri" "ar" "oh"

随后,对于像德克萨斯州这样的州,你希望缩写为“tx”而不是“te”,我认为你需要手动重新编码这些。首先,您可以使用此代码确定哪些缩写需要额外操作:

df[!df$state_final %in% tolower(state.abb),]$state_final 
[1] "te" 

然后做一些像这样的事情来重新编码错误的缩写:

df$state_final <- car::recode(df$state_final, "'te' = 'tx'")

您可以通过在'tx'之后添加分号来添加更多这些内容,例如:

"'te' = 'tx' ; 'ao' = 'az'" 

如果亚利桑那州被错误地缩写为ao。