这似乎很明显,但我无法弄明白。我有一个包含状态名称和随机其他单词的字符向量,并希望提取状态名称。
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)
但是只打印所有州名。
答案 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.