如何移除列表中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
相关产品推荐
相关产品推荐

