←
PDF 428 / 520 List-Columns
→
English · PDF 428
Original PDF page 428
中文 · PDF 428

#> 4 1967 34.0 11537966 836 #> 5 1972 36.1 13079460 740 #> 6 1977 38.4 14880372 786 #> # ... 还有 6 行

请注意标准分组数据框和嵌套数据框之间的区别:在分组数据框中,每一行是一个观测;在嵌套数据框中,每一行是一个组。理解嵌套数据集的另一种方式是,我们现在拥有一个元观测:一行代表一个国家的完整时间历程,而不是某个单一时间点。

列表列

现在我们有了嵌套数据框,就可以很好地开始拟合一些模型了。我们有一个模型拟合函数:

country_model <- function(df) { lm(lifeExp ~ year, data = df) }

我们想把它应用到每个数据框上。这些数据框存放在一个列表中,所以我们可以使用 purrr::map() 将 country_model 应用到每个元素:

models <- map(by_country$data, country_model)

然而,与其让模型列表作为一个游离的对象存在,我认为最好将它存储为 by_country 数据框中的一列。将相关对象存储在列中是数据框价值的关键所在,也是我认为列表列是一个如此好的想法的原因。在处理这些国家数据的过程中,我们会得到很多列表,其中每个国家对应一个元素。那么为什么不把它们都存储在同一个数据框中呢?

换句话说,我们不是在全局环境中创建一个新对象,而是要在 by_country 数据框中创建一个新变量。这正是 dplyr::mutate() 的用武之地:

by_country <- by_country %>% mutate(model = map(data, country_model)) by_country #> # 一个 tibble:142 × 4 #> country continent data model #> #> 1 Afghanistan 亚洲 <tibble [12 × 4]> <S3: lm> #> 2 Albania 欧洲 <tibble [12 × 4]> <S3: lm> #> 3 Algeria 非洲 <tibble [12 × 4]> <S3: lm>