在嵌套的数据框中使用purrr::map()出现问题

4

我正在学习 Hadley Wickham 的《R数据科学》第25章“多模型”,https://r4ds.had.co.nz/many-models.html,但在重新创建25.2.2节中的示例时遇到了问题。

这是我目前拥有的(以及有效的)内容:

require(gapminder); require(tidyverse); require(broom); require(modelr)

by_country <- gapminder %>% group_by(country,continent) %>% nest()
head(by_country)

# A tibble: 6 x 3
  country     continent data             
  <fct>       <fct>     <list>           
1 Afghanistan Asia      <tibble [12 × 4]>
2 Albania     Europe    <tibble [12 × 4]>
3 Algeria     Africa    <tibble [12 × 4]>
4 Angola      Africa    <tibble [12 × 4]>
5 Argentina   Americas  <tibble [12 × 4]>
6 Australia   Oceania   <tibble [12 × 4]>

然后定义lm()应用于每个国家的数据集:

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

然后下一行不起作用:

by_country <- by_country %>%
  mutate(model = map(data,country_model))

带有错误消息
Error in eval(predvars, data, env) : object 'lifeExp' not found 

尽管在我看来,我所写的内容与Hadley的章节中出现的内容相同,但我不确定这是否是最近出现的问题,因为显然有人遇到了一个例子的问题:https://github.com/hadley/r4ds/issues/766(没有解决方案)。任何帮助将不胜感激!

我已经安装了dplyr v0.8.3和purrr v0.3.2,这个程序可以正常运行:我得到了一个数据框,其中包含一个嵌套数据的列表列和一个lm对象的列表列。不过我认为我的更新可能有点落后了。 - camille
sessionInfo() 的输出是什么? - Aurèle
@Parfait 好主意,但会导致以下错误: Error in UseMethod("unnest_") : 对于类“list”的对象未应用“unnest_”方法。 - yanqui
@Aurèle,我的sessioninfo在这里链接:https://pastebin.com/t0WhrURN - yanqui
我能够运行这个例子。唯一的区别是我调用库而不是使用 require,即 library(gapminder) library(tidyverse) library(broom) library(modelr) - Vitali Avagyan
您的 dplyrpurrr 版本过旧,请尝试升级。请注意,由于 tidyverse 的快速发展和其内部变化,曾经有效的代码可能会失效,而新的代码也可能无法正常工作。这是 tidy 环境面临的挑战之一。 - Parfait
2个回答

1
group_by + nest组合可以用nest_by替换,唯一不同的是结果按行分组,因此您需要将函数放在列表中。像这样:
results <- gapminder %>% 
    nest_by(continent, country) %>% 
    mutate(model = list(lm(lifeExp ~ year, data = data)))

1

你不需要两次重新定义“by_country”。

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

by_country <- gapminder %>% 
group_by(country,continent) %>% 
nest()%>%
mutate(model = map(data,country_model))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接