首页 > 解决方案 > 在“许多模型”设置中的嵌套数据框中使用 data_grid

问题描述

我有大量模型存储在与此类似的嵌套数据框中(示例改编自许多模型):

library(gapminder)
data(gapminder)

# Nest data.
nested.gap <- gapminder %>% 
  group_by(country, continent) %>% 
  nest()

# Make a model.
many.mod <- function(df) {
  lm(lifeExp ~ year + gdpPercap, data = df)
}

# Apply model to nested data.
nested.gap <- nested.gap %>% 
  mutate(model=map(data, many.mod))

head(nested.gap)

  country     continent data              model 
  <fct>       <fct>     <list>            <list>
1 Afghanistan Asia      <tibble [12 x 4]> <lm>  
2 Albania     Europe    <tibble [12 x 4]> <lm>  

我想用data_grid()每个模型生成一个网格,存储为嵌套数据框,如下所示:

  country     continent data              model   grid
  <fct>       <fct>     <list>            <list>  <list>
1 Afghanistan Asia      <tibble [12 x 4]> <lm>    <tibble [12 x 2]>
2 Albania     Europe    <tibble [12 x 4]> <lm>    <tibble [12 x 2]>

这对于单个数据集和单个模型来说很容易做到,即

nz <- filter(gapminder, country == "New Zealand")
nz_mod <- lm(lifeExp ~ year + gdpPercap, data = nz)
data_grid(nz, year, .model=nz_mod)

    year gdpPercap
   <int>     <dbl>
 1  1952    16933.
 2  1957    16933.

但我不知道如何将其应用于我的嵌套数据框。有什么建议么?

标签: rtidyverse

解决方案


你需要的是map2purrr

# I define a function take two param data & model as data_grid needed both
# and the year is getting from the data.
data_grid_model <- function(data, model) {
  data_grid(data, year, .model = model)
}

# Here I use map2 which take two input data & model
nested.gap %>%
  mutate(grid = map2(data, model, data_grid_model))

这是输出

# A tibble: 142 x 5
# Groups:   country, continent [142]
   country     continent data              model  grid             
   <fct>       <fct>     <list>            <list> <list>           
 1 Afghanistan Asia      <tibble [12 × 4]> <lm>   <tibble [12 × 2]>
 2 Albania     Europe    <tibble [12 × 4]> <lm>   <tibble [12 × 2]>
 3 Algeria     Africa    <tibble [12 × 4]> <lm>   <tibble [12 × 2]>
 4 Angola      Africa    <tibble [12 × 4]> <lm>   <tibble [12 × 2]>
 5 Argentina   Americas  <tibble [12 × 4]> <lm>   <tibble [12 × 2]>
 6 Australia   Oceania   <tibble [12 × 4]> <lm>   <tibble [12 × 2]>
 7 Austria     Europe    <tibble [12 × 4]> <lm>   <tibble [12 × 2]>
 8 Bahrain     Asia      <tibble [12 × 4]> <lm>   <tibble [12 × 2]>
 9 Bangladesh  Asia      <tibble [12 × 4]> <lm>   <tibble [12 × 2]>
10 Belgium     Europe    <tibble [12 × 4]> <lm>   <tibble [12 × 2]>
# … with 132 more rows

你可以在这里了解更多map2


推荐阅读