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.
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)
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With