合并列表列数据框
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()
我希望做的是按年份合并列表列 lifeExp
、pop
和 gdpPercap
(我的数据中有超过三个这样的列).但我不确定如何使用 mutate
和 pmap
/ map2
.
来解决这个问题
到目前为止,我的尝试是将 pmap
与 bind_cols
一起使用,如下所示:(假设行对应)
gap_main %>%
mutate(all = pmap(list(lifeExp, pop, gdpPercap), ~ bind_cols(...)))
或重复使用 map2
和 left_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
我有一个包含多个列表列的数据框/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()
我希望做的是按年份合并列表列 lifeExp
、pop
和 gdpPercap
(我的数据中有超过三个这样的列).但我不确定如何使用 mutate
和 pmap
/ map2
.
到目前为止,我的尝试是将 pmap
与 bind_cols
一起使用,如下所示:(假设行对应)
gap_main %>%
mutate(all = pmap(list(lifeExp, pop, gdpPercap), ~ bind_cols(...)))
或重复使用 map2
和 left_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