Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Select rows based on column value in a list of dataframes

I have a list of dataframes and each one looks like this:

df1:

Name X Y
AAA 10 5
AAA 20 10
AAA 30 15
AAA 40 20

df2:

Name X Y
BBB 20 10
BBB 30 15
BBB 40 20

df3:

Name X Y
CCC 10 5
CCC 20 10
CCC 30 15
CCC 40 20

And I have another dataframe like this:

ID Name
1 AAA
2 CCC
3 FFF

I would like to extract the dataframes from the list that have the same names as the last dataframe. So, in this case, I would get only df1 and df3.

like image 205
Alejandro Rivera Avatar asked Sep 15 '25 05:09

Alejandro Rivera


2 Answers

You can do this in base R using lapply and indexing. Below, the unlist(lapply(ll, function(x) any(x$Name %in% mtch$Name))) tests each nested data frame to see if the name matches names in the provided key, and returns a boolean vector that you can index on.

ll <- list(df1, df2, df3)

ll[unlist(lapply(ll, function(x) any(x$Name %in% mtch$Name)))]

output:

[[1]]
  Name  X  Y
1  AAA 10  5
2  AAA 20 10
3  AAA 30 15
4  AAA 40 20

[[2]]
  Name  X  Y
1  CCC 10  5
2  CCC 20 10
3  CCC 30 15
4  CCC 40 20

Data:

df1  <- read.table(text = "Name X   Y
AAA 10  5
AAA 20  10
AAA 30  15
AAA 40  20", h = T)

df2  <- read.table(text = "Name X   Y
BBB 20  10
BBB 30  15
BBB 40  20", h = T)

df3  <- read.table(text = "Name X   Y
CCC 10  5
CCC 20  10
CCC 30  15
CCC 40  20", h = T)

mtch <- read.table(text = "ID   Name
       1    AAA
       2    CCC
       3    FFF", h = T)
like image 127
jpsmith Avatar answered Sep 16 '25 18:09

jpsmith


Using keep

library(purrr)
keep(list(df1, df2, df3), ~ unique(.x[[1]]) %in% mtch$Name)

-output

[[1]]
  Name  X  Y
1  AAA 10  5
2  AAA 20 10
3  AAA 30 15
4  AAA 40 20

[[2]]
  Name  X  Y
1  CCC 10  5
2  CCC 20 10
3  CCC 30 15
4  CCC 40 20
like image 37
akrun Avatar answered Sep 16 '25 20:09

akrun