部分字符串与新列中匹配的正则表达式匹配 - R.

时间:2015-10-06 22:11:25

标签: regex r grepl

我试图将数据集中列的内容与正则表达式字符串部分匹配。然后我想匹配在新列中返回特定匹配正则表达式的行。我的实际数据集很大(130万行),有300个正则表达式,因此找到一种自动执行此操作的方法非常重要,因此添加新的正则表达式不需要代码调整。

演示:

try.dat<-data.frame(c(1:10),c("hello","goodbye","tidings","partly","totally"))
names(try.dat)[1]<-"num"
names(try.dat)[2]<-"words"
try.dat

在这种情况下,如果一个正则表达式是'ly',我希望在匹配的行(部分,完全)中有一个'ly'列,在其他行中有一些'不匹配'的术语。我已经成功地使用grepl(subset not based on exact match)成功地对数据进行了子集,这非常有效,但这是我真正努力的下一步!

我在尝试这个时已经取得了一些的进展,主要是基于这个代码建议(partial string matching R),我已经这样做了:

pattern<-c("ll|ood")
matching<-c("ood","ll")
regexes<-data.frame(pattern,matching)
output_vector<-character(nrow(try.dat))
for(i in seq_along(regexes)){
output_vector[grepl(x=try.dat$words,pattern=regexes[[i]][1])] <- regexes    [[i]][2]    
}
try.dat$match<- output_vector
try.dat

正如你所看到的,这会在匹配的行旁边返回一个“1” - 到达那里但我的想法已经用完了!我想知道是否有人可以给出任何指示?

谢谢!

2 个答案:

答案 0 :(得分:2)

我认为这会吗?

library(stringr)
try.dat$match = str_extract(try.dat$words, "ll|ood")
try.dat
#    num   words match
# 1    1   hello    ll
# 2    2 goodbye   ood
# 3    3 tidings  <NA>
# 4    4  partly  <NA>
# 5    5 totally    ll
# 6    6   hello    ll
# 7    7 goodbye   ood
# 8    8 tidings  <NA>
# 9    9  partly  <NA>
# 10  10 totally    ll

默认行为是提取第一个匹配项。如果您想获得所有匹配项,可以使用str_extract_all,但在这种情况下,您需要一个可以处理不同匹配数量的非数据框架设置。

答案 1 :(得分:1)

基础R选项。只是因为。

patt <- c("ll", "ood")
for (i in 1: length(patt)) {
  try.dat[grep(patt[i], try.dat$words), "match"] <- patt[i]
}
try.dat
#    num  words match
#1    1   hello    ll
#2    2 goodbye   ood
#3    3 tidings  <NA>
#4    4  partly  <NA>
#5    5 totally    ll
#6    6   hello    ll
#7    7 goodbye   ood
#8    8 tidings  <NA>
#9    9  partly  <NA>
#10  10 totally    ll