R-选择一个正则表达式



我想选择每一行,在其中我们可以找到表达式"X01";或";X02":

dataEx <- data.frame(code = c("X01-X043","X034","X024","X015-X036-X033","X012","X015-X042","X019","X036","X022-X043"),res = NA )
pat1 <- c("(^|-)X01($|-|.)","(^|-)X02($|-|.)")
dataEx$res[grep(paste(pat1,collapse="|"),dataEx$code)] <- "ok"

它工作正常,给我的结果:

code  res
1       X01-X043   ok
2           X034 <NA>
3           X024   ok
4 X015-X036-X033   ok
5           X012   ok
6      X015-X042   ok
7           X019   ok
8           X036 <NA>
9      X022-X043   ok

但我想知道找到了哪种模式:

code  res
1       X01-X043   X01
2           X034 <NA>
3           X024   X024
4 X015-X036-X033   X015
5           X012   X012
6      X015-X042   X015
7           X019   X019
8           X036 <NA>
9      X022-X043   X022

我对正则表达式很陌生。有简单的方法吗?(事实上,"pat1"要长得多,我正在寻找20种不同的图案(

您可以通过以下方式使用str_extract

library(stringr)
dataEx$res <- str_extract(dataEx$code, "X0(1|2)\d?")

在这里,我们希望匹配文字X0,然后是12,然后是另一个可选的digit。

结果:

dataEx
code  res
1       X01-X043  X01
2           X034 <NA>
3           X024 X024
4 X015-X036-X033 X015
5           X012 X012
6      X015-X042 X015
7           X019 X019
8           X036 <NA>
9      X022-X043 X022

您对使用stringr包持开放态度吗?我同意Jaskeil的观点,我更喜欢data.table而不是data.frame,但这主要是为了执行速度。不确定这是否会引起您的申请。

library(stringr)
dataEx <- data.frame(code = c("X01-X043","X034","X024","X015-X036-X033","X012","X015-X042","X019","X036","X022-X043"),res = NA )
dataEx$res <- str_extract(dataEx$code, "((^|-)X01($|-|.))|((^|-)X02($|-|.))")

你可以做:

a <- regmatches(dataEx$code, gregexpr(paste(pat1, collapse = "|"), dataEx$code))
is.na(a)<-lengths(a)==0
dataEx$res <- unlist(a)

但问题是,如果一排有不止一场比赛怎么办?

相关内容

最新更新