我是purrr
范式的新手,并且正在努力解决它。
根据几个来源,我已经设法嵌套数据框,在嵌套数据上运行线性模型,从每个 lm 中提取一些系数,并为每个 lm 生成摘要。我想做的最后一件事是从摘要中提取“r.squared”(我原以为这是我想要实现的最简单的部分),但无论出于何种原因,我都无法获得语法正确的。
这是我所拥有的 MWE:
library(purrr)
library(dplyr)
library(tidyr)
mtcars %>%
nest(-cyl) %>%
mutate(fit = map(data, ~lm(mpg ~ wt, data = .)),
sum = map(fit, ~summary))
这是我提取失败的 r.squared 的尝试:
mtcars %>%
nest(-cyl) %>%
mutate(fit = map(data, ~lm(mpg ~ wt, data = .)),
sum = map(fit, ~summary),
rsq = map_dbl(sum, "r.squared"))
Error in eval(substitute(expr), envir, enclos) : `x` must be a vector (not a closure)
这与 RStudio 网站上给出的示例表面上相似:
mtcars %>%
split(.$cyl) %>%
map(~ lm(mpg ~ wt, data = .x)) %>%
map(summary) %>%
map_dbl("r.squared")
这可行,但是我希望 r.squared 值位于一个新列中(因此是 mutate 语句),并且我想了解为什么我的代码不起作用而不是解决问题。
编辑:
这是我使用以下解决方案的工作解决方案:
mtcars %>%
nest(-cyl) %>%
mutate(fit = map(data, ~lm(mpg ~ wt, data = .)),
summary = map(fit, glance),
r_sq = map_dbl(summary, "r.squared"))
编辑2:
因此,事实证明该错误来自于在 summary = map(fit, ~summary) 行中包含波浪号键。我的猜测是使对象成为嵌套的函数,而不是摘要本身返回的对象。如果有人想插话,希望对此有权威的回答。
需要明确的是,这个版本的原始代码可以正常工作:
mtcars %>%
nest(-cyl) %>%
mutate(fit = map(data, ~lm(mpg ~ wt, data = .)),
summary = map(fit, summary),
r_sq = map_dbl(summary, "r.squared"))