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

如何移除列表中try函数执行报错的元素?(车辆数据分段回归场景)

过滤分段回归拟合失败的列表元素

我明白你的场景——拆分车辆数据后用purrr::map()+try()拟合分段回归,现在要清理掉那些拟合失败产生的错误对象对吧?这其实很容易实现,核心是利用try()报错时返回的try-error类对象来筛选。

第一步:完成模型拟合(带错误捕获)

首先先把你的拟合代码补全,记得给try()加上silent = TRUE避免刷屏式的报错信息,而且segmented()需要先拟合一个基础线性模型,别漏了这一步:

# 拆分数据为单车辆列表
vehicle_data_list <- my_df %>% split(., .$per.Vehicle.I...)

# 批量拟合分段回归,用try捕获错误
model_results <- vehicle_data_list %>%
  purrr::map(function(vehicle_data) {
    try({
      # 先拟合基础线性模型(segmented的前置要求)
      base_model <- lm(你的因变量 ~ 你的自变量, data = vehicle_data)
      # 拟合分段回归
      segmented::segmented(base_model, seg.Z = ~你的自变量)
    }, silent = TRUE) # 静默模式,不输出报错信息
  })

第二步:过滤掉拟合失败的元素

try()在拟合失败时会返回一个try-error类型的对象,我们可以用purrr::keep()来筛选出正常的模型:

方法1:直接判断try-error类型

# 保留所有拟合成功的模型
valid_models <- model_results %>%
  purrr::keep(function(model) !inherits(model, "try-error"))

如果你喜欢更简洁的purrr风格,也可以用匿名函数的简写:

valid_models <- model_results %>%
  purrr::keep(~!inherits(.x, "try-error"))

方法2:先将错误转为NULL再过滤

你也可以在拟合时把错误对象替换成NULL,之后过滤NULL元素,这种方式更直观:

# 拟合时将错误转为NULL
model_results <- vehicle_data_list %>%
  purrr::map(function(vehicle_data) {
    fit_result <- try({
      base_model <- lm(你的因变量 ~ 你的自变量, data = vehicle_data)
      segmented::segmented(base_model, seg.Z = ~你的自变量)
    }, silent = TRUE)
    # 报错则返回NULL,否则返回模型
    if (inherits(fit_result, "try-error")) NULL else fit_result
  })

# 过滤NULL得到有效模型
valid_models <- model_results %>% purrr::keep(!is.null(.))

额外技巧:查看哪些车辆拟合失败

如果你想知道具体是哪些车辆ID拟合失败了,可以用purrr::discard()提取错误元素,再取它们的名称:

# 获取拟合失败的车辆ID
failed_vehicle_ids <- model_results %>%
  purrr::discard(~!inherits(.x, "try-error")) %>%
  names()

# 打印结果
cat("拟合失败的车辆ID:", paste(failed_vehicle_ids, collapse = ", "), "\n")

内容的提问来源于stack exchange,提问作者umair durrani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:52:54