【问题标题】:Using grep with very large vector of regular expressions in r在 r 中使用带有非常大的正则表达式向量的 grep
【发布时间】:2017-04-05 08:55:32
【问题描述】:

我有一个相当大的向量 (table),其中包含 325k 个独特的观察值,我想将其用作正则表达式列表,以在另一个包含 26k 个观察值的向量 (data) 中查找匹配项。

我正在使用下面的这段代码,如果table 并且生成的正则表达式列表少于 3000 个条目(尽管我猜这是字符数而不是表达式作为一个洞很重要),它会很好地工作:

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

但如果“表”和生成的正则表达式列表比这个长,我会得到错误:

PCRE 模式编译错误 - '正则表达式太大'

我要搜索的观察结果有多种字符串模式,例如“xxx-yyyy”、“L-cc-fff-C12Z3N-xxx”,甚至“Name.xxx-12N7t-p6”和很快。因此,解析出可能与我的 325k 向量中的正则表达式之一匹配的字符串部分并使用 match() 并因此我希望使用正则表达式是不现实的。

除了将我的“表”分成 3000 多个子集并使用上述代码之外,最好的方法是什么?

R 版本 3.2.3 (2015-12-10) -- “木制圣诞树”
版权所有 (C) 2015 统计计算 R 基金会
平台:x86_64-w64-mingw32/x64(64 位)
在 R-Studio 版本 0.98.1028

感谢您的帮助。

【问题讨论】:

  • 你真的需要正则表达式吗?或者您只是在寻找完全匹配的子字符串?还是整个字符串匹配?你能显示一些你的搜索字符串吗?
  • 如果你必须完成工作,你可以把它分成几个搜索而不是强迫一个
  • 使用stringr/stringi,它使用不同的正则表达式库并且不受 PCRE ~65k 长度限制
  • 这很慢,但如果这是一次性操作,那么速度可能并不重要:matches = unique(unlist(lapply(mytable, grep, x=mydata$id, value=F)))。用 30k 个条目在 table 和 vector 上进行测试 - 大约需要 5 分钟。因此,您的全套设备大概需要一个小时左右
  • @AustinOverman 嗯,这应该可以。也许是因为您还需要指定 perl=TRUE,具体取决于您的正则表达式是如何制定的?这就是为什么在 SO 上发布一个最小示例是一种很好的做法(并且非常需要),这样我们就可以解决这样的问题。

标签: r regex


【解决方案1】:

您可以在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

【讨论】:

  • datatable 都不是 R 中的保留字。它们是函数名称,但可以用新值覆盖它们。如果要查看 R 中的保留字列表,请在控制台中键入 ?Reserved。 (有些保留字也是函数名。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-16
  • 2014-06-29
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多