如何在dplyr管道链中从lm线性模型提取调整R²值
报错原因
pull()是dplyr专为数据框、tibble设计的列提取函数,summary(lm())返回的是summary.lm类的列表对象,没有对应的pull方法,因此第一种写法报错。- 管道运算符默认会把左侧输出作为右侧函数的第一个参数,
x %>% summary()$adj.r.squared会被解析为$(summary(x), summary(), adj.r.squared),相当于给$运算符传入了3个参数,不符合参数要求,因此第二种写法报错。
实现方案
方案1:使用purrr::pluck提取列表元素(适配管道+map场景)
pluck是purrr提供的通用列表元素提取函数,完美适配管道语法和列表列映射场景:
# 单个模型提取调整R² x %>% summary() %>% pluck("adj.r.squared") # 列表列场景下结合map_dbl批量提取 library(tidyverse) plist %>% mutate(adj_r2 = map_dbl(lm, ~.x %>% summary() %>% pluck("adj.r.squared")))
方案2:用大括号明确指代管道输出
如果不想额外使用提取函数,可以用大括号包裹操作,明确.指代管道传递的结果:
# 单个模型提取调整R² x %>% summary() %>% {.$adj.r.squared} # 列表列批量提取 plist %>% mutate(adj_r2 = map_dbl(lm, ~summary(.x)$adj.r.squared))
方案3:用broom包标准化模型输出(tidyverse生态推荐用法)
broom包是tidyverse生态中专门用于将模型输出转换为标准数据框的工具,转换后可以直接使用dplyr的所有操作函数:
library(broom) # 单个模型提取调整R² x %>% glance() %>% pull(adj.r.squared) # 列表列批量提取 plist %>% mutate(adj_r2 = map_dbl(lm, ~glance(.x)$adj.r.squared))
内容的提问来源于stack exchange,提问作者Doug Fir
相关产品推荐
相关产品推荐

