Как мне объединить много тибблов простым кодом?

#r #tidyverse

Вопрос:

У меня есть pop_1910 pop_2000 . Каждый тиббл имеет следующий стиль. Я хочу объединить эти тибблы в один тиббл. Я знаю bind_rows , как это сделать pop_1910 %>% bind_rows(pop_1920) %>% bind_rows(pop_1930) . Но это немного утомительно. Существуют ли какие-то эффективные способы объединения множества кадров данных?

 > pop_2000
# A tibble: 3,143 x 3
   fips   year     pop
   <chr> <dbl>    <dbl>
 1 01001  2000    33364
 2 01003  2000   112162
 3 01005  2000    23042
 4 01007  2000    15432
 5 01009  2000    40165
 6 01011  2000     9142
 7 01013  2000    16798
 8 01015  2000    90175
 9 01017  2000    29086
10 01019  2000    19470
 

Ответ №1:

Если они у вас есть в списке, вы можете использовать reduce() их для привязки всех за один ход.

 library(tidyverse)

my_df_list <- map(1:4, ~tibble(x = rnorm(5), y = rnorm(5))) 

my_df_list
#> [[1]]
#> # A tibble: 5 x 2
#>         x      y
#>     <dbl>  <dbl>
#> 1 1.99     1.19 
#> 2 0.273    0.208
#> 3 1.12     1.18 
#> 4 0.00855 -0.593
#> 5 0.502   -0.926
#> 
#> [[2]]
#> # A tibble: 5 x 2
#>         x      y
#>     <dbl>  <dbl>
#> 1  0.570  -0.709
#> 2  0.599  -0.408
#> 3 -0.687   1.38 
#> 4  0.375   1.53 
#> 5  0.0394  1.90 
#> 
#> [[3]]
#> # A tibble: 5 x 2
#>        x       y
#>    <dbl>   <dbl>
#> 1 -0.576  1.64  
#> 2  0.147 -0.0384
#> 3  0.904  0.164 
#> 4 -1.16  -1.02  
#> 5 -0.678  1.32  
#> 
#> [[4]]
#> # A tibble: 5 x 2
#>        x      y
#>    <dbl>  <dbl>
#> 1 -0.849 -0.445
#> 2 -0.786 -0.991
#> 3  1.17  -1.00 
#> 4  0.222  1.65 
#> 5 -0.656 -0.808
 
 reduce(my_df_list, bind_rows)
#> # A tibble: 20 x 2
#>           x       y
#>       <dbl>   <dbl>
#>  1  1.99     1.19  
#>  2  0.273    0.208 
#>  3  1.12     1.18  
#>  4  0.00855 -0.593 
#>  5  0.502   -0.926 
#>  6  0.570   -0.709 
#>  7  0.599   -0.408 
#>  8 -0.687    1.38  
#>  9  0.375    1.53  
#> 10  0.0394   1.90  
#> 11 -0.576    1.64  
#> 12  0.147   -0.0384
#> 13  0.904    0.164 
#> 14 -1.16    -1.02  
#> 15 -0.678    1.32  
#> 16 -0.849   -0.445 
#> 17 -0.786   -0.991 
#> 18  1.17    -1.00  
#> 19  0.222    1.65  
#> 20 -0.656   -0.808
 

Создано 2021-06-07 пакетом reprex (v2.0.0)

Ответ №2:

вы также можете использовать map_dfr просто

 purrr::map_dfr(my_list, ~.x)
 

Это даст вам один df, связанный строками.


ИЛИ в низших

 do.call(rbind, my_list)
 

Ответ №3:

Еще проще передать свой список , например, dplyr::bind_rows()

 library(dplyr)
my_list %>% bind_rows()