Как насчет слияния двух больших фреймов данных, содержащих небольшие фреймы данных, а затем слияния небольших фреймов данных в результирующий большой фрейм данных? ( yo dawg:) ) Конечно, ответ @thelatemail более элегантный и эффективный, но я просто подумал, что это будет классный пример, иллюстрирующий возможности Tidyverse.
Мы начнем с определениядва больших блока данных, содержащих кадры данных из list1
и list2
.
library(dplyr)
library(purrr)
bigdf1 <-
tibble(
name1 = names(list1),
df1 = list1
) %>%
mutate(name2 = substr(name1, 1, 1))
bigdf1
#> # A tibble: 6 x 3
#> name1 df1 name2
#> <chr> <named list> <chr>
#> 1 A_1 <df[,2] [5 × 2]> A
#> 2 A_2 <df[,2] [5 × 2]> A
#> 3 B_1 <df[,2] [5 × 2]> B
#> 4 B_2 <df[,2] [5 × 2]> B
#> 5 B_3 <df[,2] [5 × 2]> B
#> 6 C_1 <df[,2] [5 × 2]> C
bigdf2 <-
tibble(
name2 = names(list2),
df2 = list2
)
bigdf2
#> # A tibble: 3 x 2
#> name2 df2
#> <chr> <named list>
#> 1 A <df[,2] [5 × 2]>
#> 2 B <df[,2] [5 × 2]>
#> 3 C <df[,2] [5 × 2]>
Затем мы объединяем их с помощью name2
, а затем объединяем небольшие кадры данных внутри.
bigdf <-
left_join(bigdf1, bigdf2, by = "name2") %>%
mutate(df_res = map2(df1, df2, left_join, by = "col1")) %>%
mutate(df_res = set_names(df_res, name1))
bigdf
#> # A tibble: 6 x 5
#> name1 df1 name2 df2 df_res
#> <chr> <list> <chr> <list> <named list>
#> 1 A_1 <df[,2] [5 × 2]> A <df[,2] [5 × 2]> <df[,3] [5 × 3]>
#> 2 A_2 <df[,2] [5 × 2]> A <df[,2] [5 × 2]> <df[,3] [5 × 3]>
#> 3 B_1 <df[,2] [5 × 2]> B <df[,2] [5 × 2]> <df[,3] [5 × 3]>
#> 4 B_2 <df[,2] [5 × 2]> B <df[,2] [5 × 2]> <df[,3] [5 × 3]>
#> 5 B_3 <df[,2] [5 × 2]> B <df[,2] [5 × 2]> <df[,3] [5 × 3]>
#> 6 C_1 <df[,2] [5 × 2]> C <df[,2] [5 × 2]> <df[,3] [5 × 3]>
Затем bigdf$df_res
это то, что нам нужно.