合并列表列数据框

Merging list-column data frames

我有一个包含多个列表列的数据框/tibble,我想将它们相互合并/连接,但我正在努力寻找一种使用 mutate(map()) 工作流的优雅方式来完成此操作。

假设我有一个具有以下结构的数据框:

library(gapminder)

# Setup
gap_1 <- gapminder %>% 
    select(-pop, -gdpPercap) %>% 
    group_by(country, continent) %>% 
    nest() %>% 
    rename(lifeExp = data) 

gap_2 <- gapminder %>% 
    select(-lifeExp, -gdpPercap) %>% 
    group_by(country, continent) %>% 
    nest() %>% 
    rename(pop = data)  

gap_3 <- gapminder %>% 
    select(-lifeExp, -pop) %>% 
    group_by(country, continent) %>% 
    nest() %>% 
    rename(gdpPercap = data)

# What my data looks like 
gap_main <- reduce(list(gap_1, gap_2, gap_3), left_join, by = c("country", "continent")) %>% ungroup()  

我希望做的是按年份合并列表列 lifeExppopgdpPercap(我的数据中有超过三个这样的列).但我不确定如何使用 mutatepmap / map2.

来解决这个问题

到目前为止,我的尝试是将 pmapbind_cols 一起使用,如下所示:(假设行对应)

gap_main %>% 
     mutate(all = pmap(list(lifeExp, pop, gdpPercap), ~ bind_cols(...))) 

或重复使用 map2left_join。有没有更优雅的方法可以使用 reduce?

我不确定你想要的输出应该是什么样子,下面的方法对你有用吗?它使用 {dplyr} 的 rowwise 表示法,然后基本上 purrr::reduce 在一次调用中加入所有三列。

library(tidyverse)
library(gapminder)

gap_main %>% 
  rowwise %>% 
  mutate(data = list(reduce(list(lifeExp, pop, gdpPercap), left_join, by = "year")))

#> # A tibble: 142 x 6
#> # Rowwise: 
#>    country    continent lifeExp        pop           gdpPercap      data        
#>    <fct>      <fct>     <list>         <list>        <list>         <list>      
#>  1 Afghanist… Asia      <tibble [12 ×… <tibble [12 … <tibble [12 ×… <tibble [12…
#>  2 Albania    Europe    <tibble [12 ×… <tibble [12 … <tibble [12 ×… <tibble [12…
#>  3 Algeria    Africa    <tibble [12 ×… <tibble [12 … <tibble [12 ×… <tibble [12…
#>  4 Angola     Africa    <tibble [12 ×… <tibble [12 … <tibble [12 ×… <tibble [12…
#>  5 Argentina  Americas  <tibble [12 ×… <tibble [12 … <tibble [12 ×… <tibble [12…
#>  6 Australia  Oceania   <tibble [12 ×… <tibble [12 … <tibble [12 ×… <tibble [12…
#>  7 Austria    Europe    <tibble [12 ×… <tibble [12 … <tibble [12 ×… <tibble [12…
#>  8 Bahrain    Asia      <tibble [12 ×… <tibble [12 … <tibble [12 ×… <tibble [12…
#>  9 Bangladesh Asia      <tibble [12 ×… <tibble [12 … <tibble [12 ×… <tibble [12…
#> 10 Belgium    Europe    <tibble [12 ×… <tibble [12 … <tibble [12 ×… <tibble [12…
#> # … with 132 more rows

或者,您可以通过以下方式使用 pmap 而不是 rowwise

gap_main %>% 
  mutate(all = pmap(list(lifeExp, pop, gdpPercap),
                    ~ reduce(list(..1, ..2, ..3), left_join, by = "year"))) 

#> # A tibble: 142 x 6
#>    country    continent lifeExp        pop           gdpPercap      all         
#>    <fct>      <fct>     <list>         <list>        <list>         <list>      
#>  1 Afghanist… Asia      <tibble [12 ×… <tibble [12 … <tibble [12 ×… <tibble [12…
#>  2 Albania    Europe    <tibble [12 ×… <tibble [12 … <tibble [12 ×… <tibble [12…
#>  3 Algeria    Africa    <tibble [12 ×… <tibble [12 … <tibble [12 ×… <tibble [12…
#>  4 Angola     Africa    <tibble [12 ×… <tibble [12 … <tibble [12 ×… <tibble [12…
#>  5 Argentina  Americas  <tibble [12 ×… <tibble [12 … <tibble [12 ×… <tibble [12…
#>  6 Australia  Oceania   <tibble [12 ×… <tibble [12 … <tibble [12 ×… <tibble [12…
#>  7 Austria    Europe    <tibble [12 ×… <tibble [12 … <tibble [12 ×… <tibble [12…
#>  8 Bahrain    Asia      <tibble [12 ×… <tibble [12 … <tibble [12 ×… <tibble [12…
#>  9 Bangladesh Asia      <tibble [12 ×… <tibble [12 … <tibble [12 ×… <tibble [12…
#> 10 Belgium    Europe    <tibble [12 ×… <tibble [12 … <tibble [12 ×… <tibble [12…
#> # … with 132 more rows