嵌套分组下,如何对含NULL的lm结果执行条件式map操作?
解决分组中部分不适用lm()时的summary()映射问题
核心问题分析
你之前的尝试失败,主要是因为map_if的.else参数传入了字符串"NA",后续对该字符串调用summary()会直接报错。正确的做法是让非适用分组返回可被后续逻辑识别的占位值(比如NULL),再针对性处理summary()的调用。
解决方案
方法1:结合map_if与错误捕获函数possibly
先为非适用分组生成NULL占位的线性模型对象,再用possibly包裹summary(),自动跳过无效对象的处理:
library(tibble) library(dplyr) library(tidyr) library(purrr) # 生成带分组的嵌套数据,VC分组返回NULL df <- as_tibble(ToothGrowth) %>% group_by(supp) %>% nest() %>% mutate( lin.mod = map_if(data, supp != "VC", ~ lm(len ~ dose, .x), .else = ~ NULL) ) # 创建安全版summary函数,遇到错误返回NULL safe_summary <- possibly(summary, otherwise = NULL) # 对lin.mod映射安全版summary df <- df %>% mutate(lin.mod.res = map(lin.mod, safe_summary)) # 查看结果 df
方法2:自定义判断函数,仅对lm对象执行summary
写一个自定义函数,先判断输入是否为lm类型,再决定是否执行summary():
# 自定义函数:仅处理lm对象 summary_lm_only <- function(x) { if (inherits(x, "lm")) { summary(x) } else { NULL # 可替换为你需要的占位值,比如NA } } # 直接映射自定义函数 df <- df %>% mutate(lin.mod.res = map(lin.mod, summary_lm_only))
方法3:用map2直接结合分组条件生成模型
如果需要更直观的分组判断,可以用map2同时传入数据和分组变量,在生成模型时直接过滤:
df <- as_tibble(ToothGrowth) %>% group_by(supp) %>% nest() %>% mutate( lin.mod = map2(data, supp, ~ if (.y != "VC") lm(len ~ dose, .x) else NULL), lin.mod.res = map(lin.mod, summary_lm_only) )
结果说明
处理后,VC分组的lin.mod.res会返回NULL(或你指定的占位值),而OJ分组会正常返回线性模型的summary结果,不会出现报错。
内容的提问来源于stack exchange,提问作者maRvin
相关产品推荐
相关产品推荐

