如何使用 grep 使用 R 中的第二个字符向量列表在数据帧列表中搜索模式匹配

How to use grep to search for patterns matches within a list of data frames using a second list of character vectors in R

我在 R 中有两个列表。一个是数据框列表,其中的行包含字符串(列表 1)。另一个是字符列表(相同长度)(列表 2)。我想以并行方式浏览列表,从列表 2 中获取字符串并搜索它以获取其在列表 1 中相应元素的数据框中的位置(使用 grep)。这是一个玩具示例我的列表是什么样子的:

List1 <- list(data.frame(a = c("other","other","dog")), 
              data.frame(a = c("cat","other","other")),
              data.frame(a = c("other","other","bird")))

List2 <- list("a" = c("dog|xxx|xxx"), 
              "a" = c("cat|xxx|xxx"), 
              "a" = c("bird|xxx|xxx"))

我想要得到的输出是模式匹配列表 1 中每个数据框中的位置列表,即在本例中,位置将是 3、1 和 3。因此列表将是:

[[1]]
[1] 3

[[2]]
[1] 1

[[3]]
[1] 3

我似乎不知道该怎么做。

我试过了 lapply:

    NewList1 <- lapply(1:length(List1), 
                    function(x) grep(List2[[x]])) 

但这不起作用。我也试过 purrr:map2:

NewList2<-map2(List2, List1, grep(List2$A, List1))

这也不行。如果有人就如何解决此问题提出任何建议,我将不胜感激。非常感谢任何愿意介入的人!

使用 Map 你可以做到 -

Map(function(x, y) grep(y, x$a), List1, List2)

#[[1]]
#[1] 3

#[[2]]
#[1] 1

#[[3]]
#[1] 3

map2 尝试已结束,但您需要在函数中将列表引用为 .x.y

purrr::map2(List2, List1, ~grep(.x, .y$a))

尝试 Map + unlist

> Map(grep, List2, unlist(List1, recursive = FALSE))
$a
[1] 3

$a
[1] 1

$a
[1] 3