Home > Back-end >  How to use grep to search for patterns matches within a list of data frames using a second list of c
How to use grep to search for patterns matches within a list of data frames using a second list of c

Time:11-13

I have two lists in R. One is a list of data frames with rows that contain strings (List 1). The other is a list (of the same length) of characters (List 2). I would like to go through the lists in a parallel fashion taking the character string from List 2 and searching for it to get its position (using grep) in the data frame at the corresponding element in List 1. Here is a toy example to show what my lists look like:

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"))

The output I would like to get would be a list of the position in each data frame in List 1 of the pattern match i.e. in this example the positions would be 3, 1 & 3. So the list would be:

[[1]]
[1] 3

[[2]]
[1] 1

[[3]]
[1] 3

I cannot seem to figure out how to do this.

I tried lapply:

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

But that does not work. I also tried purrr:map2:

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

This also does not work. I would be very grateful of any suggestions anyone may have as to how to fix this. Many thanks to anyone willing to wade in!

CodePudding user response:

Try Map unlist

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

$a
[1] 1

$a
[1] 3

CodePudding user response:

Using Map you can do -

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

#[[1]]
#[1] 3

#[[2]]
#[1] 1

#[[3]]
#[1] 3

The map2 attempt was close but you need to refer lists as .x and .y in the function.

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