You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套分组下,如何对含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 21:55:20