在r中使用带有非常大的正则表达式向量的grep

时间:2016-11-21 20:45:49

标签: r regex

我有一个相当大的向量(table),带有325k个独特的观测值,我想用它作为正则表达式列表来查找26k观测值的另一个向量(data)中的匹配项。

我正在使用下面的代码,如果table并且正则表达式的结果列表少于3000个条目(虽然我猜它是字符数而不是表达式作为重要的洞),但效果很好:

matches <- unique(grep(paste(table, collapse="|"), 
                       data$ID,
                       perl = TRUE,
                       value=FALSE))

但如果&#39;表&#39;正则表达式的结果列表比这更长我得到错误:

  

PCRE模式编译错误 - &#39;正则表达式太大&#39;

我想要搜索的观察结果包含多种字符串模式,例如&#34; xxx-yyyy&#34;,&#34; L-cc-fff-C12Z3N-xxx&#34;甚至&#34; Name.xxx-12N7t-P6&#34;等等。因此,解析可能与我的325k向量中的一个正则表达式匹配的字符串部分并使用match()并因此我希望使用正则表达式是不现实的。

什么是最好的方法,而不是打破我的表#39;进入3000多个子集并使用上面的代码?

R版本3.2.3(2015-12-10) - &#34;木制圣诞树&#34;
版权所有(C)2015 R统计计算基础
平台:x86_64-w64-mingw32 / x64(64位)
在R-Studio版本0.98.1028中

感谢您的协助。

1 个答案:

答案 0 :(得分:0)

您可以在apply循环中逐个检查每个正则表达式字符串。这将有点慢,但如果速度不重要,它将提供一个令人满意的解决方案:

matches = unique(unlist(lapply(mytable, grep, x=mydata$id, value=F))). 

一些可重现的数据可用于测试:

mydata = data.frame(id = paste0(sample(letters, 30000, T), 
                              sample(letters, 30000, T),
                              sample(letters, 30000, T),
                              sample(letters, 30000, T)))

mytable = paste0(sample(letters, 30000, T), 
               sample(letters, 30000, T),
               sample(letters, 30000, T),
               sample(letters, 30000, T))

顺便说一句,datatable都是R中的保留字,因此将这些用作变量名称并不是很好的做法。因此,我将其称为mytablemydata