我正在尝试使用 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)
这里的几个答案可以适应这一点,我认为:
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))
您可能能够通过对目标进行批处理并粘贴/折叠每批来提高效率......)