【发布时间】: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 上发布一个最小示例是一种很好的做法(并且非常需要),这样我们就可以解决这样的问题。