好问题!
Nest 是为了解决我们想要应用一个以复杂结构作为输入的函数的问题,我能想到的一个很好的例子是 lm 函数,正如优秀书籍 r4ds https://r4ds.had.co.nz/many-models.html#gapminder 中所展示的那样/p>
tidyverse 上还有一个新功能叫做nest_by,我展示了如何替换旧的nest 代码,但两者在正确的上下文中都非常有用
library(tidyverse)
library(gapminder)
by_country <- gapminder %>%
group_by(country, continent) %>%
nest()
by_country
#> # A tibble: 142 x 3
#> # Groups: country, continent [142]
#> country continent data
#> <fct> <fct> <list>
#> 1 Afghanistan Asia <tibble [12 x 4]>
#> 2 Albania Europe <tibble [12 x 4]>
#> 3 Algeria Africa <tibble [12 x 4]>
#> 4 Angola Africa <tibble [12 x 4]>
#> 5 Argentina Americas <tibble [12 x 4]>
#> 6 Australia Oceania <tibble [12 x 4]>
#> 7 Austria Europe <tibble [12 x 4]>
#> 8 Bahrain Asia <tibble [12 x 4]>
#> 9 Bangladesh Asia <tibble [12 x 4]>
#> 10 Belgium Europe <tibble [12 x 4]>
#> # ... with 132 more rows
country_model <- function(df) {
lm(lifeExp ~ year, data = df)
}
by_country <- by_country %>%
mutate(model = map(data, country_model))
by_country
#> # A tibble: 142 x 4
#> # Groups: country, continent [142]
#> country continent data model
#> <fct> <fct> <list> <list>
#> 1 Afghanistan Asia <tibble [12 x 4]> <lm>
#> 2 Albania Europe <tibble [12 x 4]> <lm>
#> 3 Algeria Africa <tibble [12 x 4]> <lm>
#> 4 Angola Africa <tibble [12 x 4]> <lm>
#> 5 Argentina Americas <tibble [12 x 4]> <lm>
#> 6 Australia Oceania <tibble [12 x 4]> <lm>
#> 7 Austria Europe <tibble [12 x 4]> <lm>
#> 8 Bahrain Asia <tibble [12 x 4]> <lm>
#> 9 Bangladesh Asia <tibble [12 x 4]> <lm>
#> 10 Belgium Europe <tibble [12 x 4]> <lm>
#> # ... with 132 more rows
# The new way is using nest_by
by_country_new <- gapminder %>%
nest_by(country,continent) %>%
mutate(model = list(country_model(data)))
by_country_new
#> # A tibble: 142 x 4
#> # Rowwise: country, continent
#> country continent data model
#> <fct> <fct> <list<tbl_df[,4]>> <list>
#> 1 Afghanistan Asia [12 x 4] <lm>
#> 2 Albania Europe [12 x 4] <lm>
#> 3 Algeria Africa [12 x 4] <lm>
#> 4 Angola Africa [12 x 4] <lm>
#> 5 Argentina Americas [12 x 4] <lm>
#> 6 Australia Oceania [12 x 4] <lm>
#> 7 Austria Europe [12 x 4] <lm>
#> 8 Bahrain Asia [12 x 4] <lm>
#> 9 Bangladesh Asia [12 x 4] <lm>
#> 10 Belgium Europe [12 x 4] <lm>
#> # ... with 132 more rows
由reprex package (v0.3.0) 于 2020 年 6 月 7 日创建
这也是在 iris 数据集上嵌套 Species 的新方法
library(tidyverse)
iris %>%
group_by(Species) %>%
nest()
#> # A tibble: 3 x 2
#> # Groups: Species [3]
#> Species data
#> <fct> <list>
#> 1 setosa <tibble [50 x 4]>
#> 2 versicolor <tibble [50 x 4]>
#> 3 virginica <tibble [50 x 4]>
由reprex package (v0.3.0) 于 2020 年 6 月 7 日创建