grepl 在 R 中具有数千种模式

问题描述 投票:0回答:1

我正在尝试使用 grepl 查找行匹配。 Grepl 在这种情况下很重要,因为我也在尝试查找部分匹配项。问题是我有数千种模式

我正在使用这个:

matches = mypattern_list$names

df2 = df %>% filter(grepl(paste(matches, collapse = "|"), target_column))

但是因为我有数千种模式,所以出现以下错误:

TRE pattern compilation error 'Out of memory'

有没有办法用 grepl 做同样的事情,但使用例如 reduce 和 lapply?

示例数据框(小版本)

mypattern_list= read.table(text="Names
fox
turtle
shark
etc_up_to_10000", sep="\t", header=TRUE)

df= read.table(text="target column
The (fox) was running into the forest
This phrase has nothing to do with animals
baby SHARK
etc_up_to_10000", sep="\t", header=TRUE)

结果将是包含关键字的任何内容:

results= read.table(text="results
The (fox) was running into the forest
baby SHARK
etc_up_to_10000", sep="\t", header=TRUE)

最小可重现示例:

res <- grepl(paste(1:10000, collapse = "|"), 1:10000)
r dplyr grepl
1个回答
0
投票

这里的几个答案可以适应这一点,我认为:

grepl_any <- function(value, targets, ...) {
   all_matches <- sapply(targets, \(t) grepl(t, value, ...))
   apply(all_matches, 1, any)
}
dplyr::filter(df, grepl_any(target.column, mypattern_list$Names,
                            ignore.case = TRUE))

可能能够通过对目标进行批处理并粘贴/折叠每批来提高效率......)

© www.soinside.com 2019 - 2024. All rights reserved.