在R中,我想使用grep
或'grepl'或'gsub'命令查找字符串向量中的所有元素,这些元素具有A道路或M道路或B道路名称在它..
请参阅下面的示例
tmp <- c('Little Street','A323', 'Essex Road (A43)', 'M43','Orange street','M4','B2045','New Street')
我想要一个函数返回......
c('Minor Road','A Road', 'A Road', 'M Road', 'Minor Road', 'M Road','B Road','Minor Road')
我的第一个想法是使用像
这样的东西grepl('[0-9]',tmp)
但这无法区分A路,B路和M路......
一如既往,我们将非常感谢任何帮助......
答案 0 :(得分:5)
这个怎么样
tmp <- c('Little Street','A323', 'Essex Road (A43)', 'M43','Orange street','M4','B2045','New Street')
road <- rep("Minor", length(tmp))
m <- regexpr("\\b[ABM]\\d+", tmp)
road[m!=-1] <- substr(regmatches(tmp, m),1,1)
paste(road, "Road")
我们使用regmatches()
和regexpr()
来查找和提取A,B或M,然后再添加一个字母
答案 1 :(得分:3)
您可以使用grepl
和sub
...
> tmp[!grepl('[ABM]\\d', tmp)] <- 'Minor Road'
> sub('.*([ABM])\\d.*', '\\1 Road', tmp)
# [1] "Minor Road" "A Road" "A Road" "M Road" "Minor Road"
# [6] "M Road" "B Road" "Minor Road"
答案 2 :(得分:1)
这可以在一个strapply语句中完成,该语句为每个输入组件返回字母后跟" Road"
,后面跟一个数字。对于任何不匹配的组件,请使用"Minor Road"
:
library(gsubfn)
strapply(tmp, "(\\D)\\d", ~ paste(x, "Road"), empty = "Minor Road", simplify = TRUE)
,并提供:
[1] "Minor Road" "A Road" "A Road" "M Road" "Minor Road"
[6] "M Road" "B Road" "Minor Road"
更新:简化回答一个语句。
答案 3 :(得分:0)
使用rex可能会使这类任务变得更简单。
tmp <- c('Little Street','A323', 'Essex Road (A43)', 'M43','Orange street','M4','B2045','New Street')
library(rex)
classify_road <- function(x) {
res <- re_matches(x,
rex(
capture(name = "type",
upper
),
digit
)
)
res$type[ is.na(res$type) ] <- "Minor"
paste(res$type, "Road")
}
classify_road(tmp)
#>[1] "Minor Road" "A Road" "A Road" "M Road" "Minor Road"
#>[6] "M Road" "B Road" "Minor Road"