r - 将嵌入其他文本的长状态名称转换为两个字母的状态缩写

标签 r regex

我的目标是识别以具有其他文本的字符向量写出的美国州,并将这些州转换为缩写形式。例如,“北卡罗来纳”到“NC”。如果向量只有长格式的状态名称,这很简单。但是,我的向量在随机位置有其他文本,如“状态”示例中所示。

states <- c("Plano New Jersey", "NC", "xyz", "Alabama 02138", "Texas", "Town Iowa 99999")

从另一个帖子我发现了这个:
state.abb[match(states, state.name)]

但它只转换独立的德克萨斯
> state.abb[match(states, state.name)]
[1] NA   NA   NA   NA   "TX"

而不是新泽西州、阿拉巴马州和爱荷华州的字符串。

来自 Fast grep with a vectored pattern or match, to return list of all matches我试过:
sapply(states, grep(pattern = state.name, x = states, value = TRUE))


Error in get(as.character(FUN), mode = "function", envir = envir) : 
  object 'Alabama 02138' of mode 'function' was not found
In addition: Warning message:
In grep(pattern = state.name, x = states, value = TRUE) :
  argument 'pattern' has length > 1 and only the first element will be used

这也不起作用:
sapply(states, function(x) state.abb[grep(state.name, states)])

这个问题没有帮助:
regular expression to convert state names to abbreviations

如何将嵌入的长名称转换为州缩写?

编辑:我想返回向量,唯一的变化是州的长名称已被缩写,例如,“新泽西州普莱诺”变成了“新泽西州普莱诺”。

感谢您纠正和/或教育我。

最佳答案

尝试:

indx <- paste0(".*(", paste(state.name, collapse="|"), ").*")
v1 <- gsub(indx, "\\1", states)
ifelse( v1 %in% state.abb, v1, state.abb[match(v1, state.name)])
#[1] "NJ" "NC" NA   "AL" "TX" "IA"

如果您只想用缩写替换状态而不是其他文本,您还可以执行以下操作:
indx1 <- paste(state.name, collapse="|")   
indx2 <- state.abb[match(v1, state.name)]

mapply(gsub, indx1, indx2, states, USE.NAMES=F)
#[1] "Plano NJ"      "NC"            "xyz"           "AL 02138"     
#[5] "TX"            "Town IA 99999"

关于r - 将嵌入其他文本的长状态名称转换为两个字母的状态缩写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25582518/

相关文章:

r - 在 R 中计算 3d 数组中 n 值的平均值

php - 用于清理字符串的正则表达式

正则表达式允许以逗号分隔的代码列表

javascript - 使用正则表达式获取由 "/"分隔的单词

regex - 用于排除单位的单元格公式的正则表达式

R - sqldf() 返回零行数据框

r - 在绘图文本中使用表达式 - 打印变量的值而不是其名称

r - 字符类型的矩阵图

r - 从...函数参数中制作一个列表

Python 正则表达式 : search and replace weirdness