如何在循环中提取Console输出值、标记分组并转为data.frame?
提取NLS循环拟合结果并整理为Data Frame
我编写了一个NLS循环,拟合结果输出在控制台中,现需提取每组的拟合参数(包括Estimate、Std. Error、t value、Pr(>|t|)),标记其所属分组后,将所有数据整理为data.frame用于后续分析。
当前循环代码
for (i in seq_along(trtlist2)) { loopmm.nls <- nls(rate ~ (Vmax * conc /(Km + conc)), data=subset(M3, M3$trtlist==trtlist2[i]), start=list(Km=200, Vmax=2), trace=TRUE ) summary(loopmm.nls) print(summary(loopmm.nls)) }
控制台输出示例(共约20组)
Parameters: Estimate Std. Error t value Pr(>|t|) Km 23.29820 9.72304 2.396 0.0228 * Vmax 0.10785 0.01165 9.258 1.95e-10 *** ---
我尝试过多种提取方法,但均无法在循环中生效;仅append方法可提取Estimate值,但无法获取其他指标。
解决方案
可以通过初始化空列表存储每组结果,循环内提取完整参数矩阵并补充分组信息,最后合并为统一的data.frame。
完整实现代码
# 初始化空列表,用于存储每组的拟合结果 result_list <- list() for (i in seq_along(trtlist2)) { # 拟合NLS模型 loopmm.nls <- nls(rate ~ (Vmax * conc /(Km + conc)), data=subset(M3, M3$trtlist == trtlist2[i]), start=list(Km=200, Vmax=2), trace=TRUE ) # 提取参数矩阵并转为数据框,保留所有指标 param_df <- as.data.frame(summary(loopmm.nls)$parameters) # 添加参数名称列(区分Km和Vmax) param_df$parameter <- rownames(param_df) # 添加分组标识 param_df$trt <- trtlist2[i] # 将当前组结果存入列表 result_list[[i]] <- param_df } # 合并所有组的结果为一个data.frame final_df <- do.call(rbind, result_list) # 重置行名,避免混乱 rownames(final_df) <- NULL # 查看最终结果 head(final_df)
代码说明
summary(loopmm.nls)$parameters直接提取包含所有指标的参数矩阵,转成数据框后保留Estimate、Std. Error、t value、Pr(>|t|)的完整信息- 给每个结果添加
parameter列(标记是Km还是Vmax)和trt列(标记所属分组) - 用列表存储每组结果,最后通过
do.call(rbind, ...)合并,比循环内直接rbind更高效
可选:转换为宽格式(Km和Vmax指标同行显示)
如果需要将Km和Vmax的对应指标放在同一行,可以使用tidyr包的pivot_wider函数转换:
library(tidyr) wide_format_df <- final_df %>% pivot_wider( id_cols = trt, names_from = parameter, values_from = c(Estimate, `Std. Error`, `t value`, `Pr(>|t|)`), names_sep = "_" ) # 查看宽格式结果 head(wide_format_df)
内容的提问来源于stack exchange,提问作者Katie Klaus
相关产品推荐
相关产品推荐

