R语言循环中向数据框追加混合效应模型结果的方法求助
解决R中循环追加混合效应模型结果到数据框的问题
你的问题核心是每次循环都直接覆盖了results对象,没有保留之前迭代的结果。下面提供两种实用的解决方法:
方法1:预先初始化空数据框,循环内用rbind追加
先创建一个列名和数据类型匹配的空数据框,每次循环把新结果行追加进去:
library(nlme) data(mtcars) names_mdl <- c("cyl", "disp", "hp", "drat") # 预先初始化空数据框,指定列类型避免类型转换问题 results <- data.frame( "Explanatory Variable" = character(), "Lower Conf Int" = numeric(), "Upper Conf Int" = numeric(), "P Value" = numeric(), stringsAsFactors = FALSE ) for (n in names_mdl){ exp <- mtcars[,n] # 拟合混合效应模型 mlme <- lme(mpg ~ exp, random = ~ 1|cyl, data = mtcars, control = lmeControl(msMaxIter = 1000, msMaxEval = 1000)) sum_mlme <- summary(mlme) conf <- intervals(mlme, level = 0.95, which = 'fixed') lower <- conf$fixed["exp","lower"] upper <- conf$fixed["exp","upper"] p <- coef(sum_mlme)[2, "p.value"] # 生成当前行结果 current_row <- data.frame( "Explanatory Variable" = n, "Lower Conf Int" = lower, "Upper Conf Int" = upper, "P Value" = p, stringsAsFactors = FALSE ) # 追加到结果数据框 results <- rbind(results, current_row) } # 查看最终结果 results
方法2:用列表收集结果,最后合并成数据框(更高效)
当迭代次数较多时,rbind循环追加会频繁修改数据框,效率较低。推荐先把每个迭代的结果存入列表,最后一次性合并:
library(nlme) data(mtcars) names_mdl <- c("cyl", "disp", "hp", "drat") # 初始化空列表 results_list <- list() for (i in seq_along(names_mdl)){ n <- names_mdl[i] exp <- mtcars[,n] mlme <- lme(mpg ~ exp, random = ~ 1|cyl, data = mtcars, control = lmeControl(msMaxIter = 1000, msMaxEval = 1000)) sum_mlme <- summary(mlme) conf <- intervals(mlme, level = 0.95, which = 'fixed') lower <- conf$fixed["exp","lower"] upper <- conf$fixed["exp","upper"] p <- coef(sum_mlme)[2, "p.value"] # 将当前结果存入列表的对应位置 results_list[[i]] <- data.frame( "Explanatory Variable" = n, "Lower Conf Int" = lower, "Upper Conf Int" = upper, "P Value" = p, stringsAsFactors = FALSE ) } # 合并列表中的所有数据框 results <- do.call(rbind, results_list) # 查看最终结果 results
关键说明
- 原代码中
sum是R的内置求和函数,建议不要用它做变量名,改成sum_mlme这类更清晰的名字,避免函数冲突。 - 两种方法的核心都是保留之前的迭代结果,而不是每次都重新赋值覆盖。列表收集的方式在大数据量下性能更优。
内容的提问来源于stack exchange,提问作者John Conor
相关产品推荐
相关产品推荐

