我的问题与此类似,但不同:
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"
显然我在这里遗漏了一些东西。我想知道是否有人有任何建议。任何帮助将非常感激。
此问题已从先前版本更新。
答案 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。