循环创建新数据框

时间:2021-05-17 11:49:25

标签: r

我有 10 个不同的回归模型,称为“regression1”、“regression2”等,以及它们相应的称为“standarderrors1”、“standarderrors2”等的标准错误。对于每个模型,我试图创建一个仅包含使用循环使用以下公式计算系数和置信区间:

for(i in 1:10){
betas <- regression[[i]]$coefficients
upper_bound <- betas + z_score*standerrors[[i]]
lower_bound <- betas - z_score*standerrors[[i]]

assign(paste0("DF",i), data.frame(betas))
assign(paste0("plot",i))$upper <- upper_bound
assign(paste0("plot",i))$lower <- lower_bound}

这第一部分运行良好,但我正在努力使用循环来创建新的数据框并添加变量,因为我不断收到错误“赋值目标扩展为非语言对象”。

关于如何使用循环创建 10 个新数据帧的任何帮助将不胜感激。

非常感谢!

2 个答案:

答案 0 :(得分:2)

按照 Anoushiravan R 的建议,获得一些数据将帮助人们帮助您找到最佳解决方案,这可能需要例如数据重塑。此外,正如 Ronak Shah 所建议的,使用列表可能会更加整洁和高效。这是一个基于包 tidy 中的 broom 函数并使用包 map 中的 purrr 函数的解决方案(我正在加载所有 tidyverse 包)。< /p>

library(tidyverse)
library(broom)
models <- list(
  m1 <- lm(Petal.Width ~ Sepal.Width, data=iris),
  m2 <- lm(Petal.Length ~ Sepal.Length, data=iris)
)

dfs <- map(models, ~tidy(.x)) %>% 
  map(~mutate(.x, lci = estimate-1.96*std.error, uci = estimate+1.96*std.error))

现在您有一个列表 dfs,其中包含每个模型的数据框。

答案 1 :(得分:1)

您可以尝试以下操作-

for(i in 1:10){
  betas <- regression[[i]]$coefficients
  upper_bound <- betas + z_score*standerrors[[i]]
  lower_bound <- betas - z_score*standerrors[[i]]
  
  assign(paste0("DF",i), data.frame(betas))
  assign(paste0("plot",i), data.frame(upper = upper_bound, lower = lower_bound))
}

但是,请注意,在全局环境中创建大量数据框并不是一个好习惯。它们难以管理并污染全球环境。考虑改用列表。