如何从字符串中提取状态名称

时间:2018-04-07 21:33:36

标签: r

这似乎很明显,但我无法弄明白。我有一个包含状态名称和随机其他单词的字符向量,并希望提取状态名称。

df <- data.frame(string = c("The quick brown Arizona","jumps over the Alabama","dog Arkansas"))

我可以单独创建提取状态名称:

df$state[grepl("Alabama",df$string)] <- "Alabama"

但是我无法弄清楚如何在没有复制和粘贴42次的情况下复制所有状态。我得到的最接近的是:

find.state <- function(x){
   df$state[grepl(x,df$string)] <- x
}
lapply(state.name, find.state)

但是只打印所有州名。

3 个答案:

答案 0 :(得分:4)

你可以用一个有点尴尬的正则表达式来做到这一点。

df$state = sub(".*\\b(Arizona|Alabama|Arkansas)\\b.*", "\\1", df$string)
df
                   string    state
1 The quick brown Arizona  Arizona
2  jumps over the Alabama  Alabama
3            dog Arkansas Arkansas

当然,您需要包含所有州的名称,而不仅仅是这三个州。因此,您可以首先将其构建为模式。

Pattern = paste0(paste0(".*\\b(", paste0(state.name, collapse="|")), ")\\b.*")
df$state = sub(Pattern, "\\1", df$string)

答案 1 :(得分:2)

R附带一个包含状态名称state.name的变量。使用paste将其折叠为一个长字符元素,|将每个状态分开。这可以用作正则表达式的搜索模式。

library(stringr)
str_extract(df$string, paste(state.name, collapse='|'))

答案 2 :(得分:0)

OP提供的样本数据中的一个选项可以是:

gsub(".*\\s(\\w+)$","\\1",df$string)
#[1] "Arizona"  "Alabama"  "Arkansas"

<强>正则表达式:

.*\s     - Look for anything followed by `space`
(\\w+)$  - Look for word character following last space till end. This will be state name.