为每次迭代保存for循环的输出

时间:2019-07-19 09:55:59

标签: r

我目前正在从事一个估算项目,需要评估估算方法。我有不完整的带有NA的数据框,据此我无法计算每个列/变量的丢失率。我的第二个数据帧包含我从第一个数据帧提取的完整案例。我现在想在包含完整案例的框架中模拟真实数据的缺失结构。如代码中所示,具有生成的NA的数据帧存储在对象“结果”中。如果我现在想复制此代码并因此生成100个不同的数据帧(如“结果”),该如何分别复制和保存它们?

我是一个初学者,非常感谢您的回答!

我试图将生成NA的循环放到另一个包含copy()命令并从1:100开始计数的循环中,并保存了这100个复制的数据帧,但这根本不起作用。

result = data.frame(res0=rep(NA, dim(comp_cas)[1]))
for (i in 1:length(Z32_miss_item$miss_per_item)) {
  dat = comp_cas[,i]
  missRate = Z32_miss_item$miss_per_item[i]
  cat (i, " ", paste0(dat, collapse=",") ," ", missRate, "!\n")                  
  df <- data.frame("res"= GenMiss(x=dat, missrate = missRate), stringsAsFactors = FALSE)
  colnames(df) = gsub("res", paste0("Var", i), colnames(df))
  result = cbind(result, df)
}
result = result[,-1]

我希望100次运行的每个数据帧都保存在我的项目文件夹中的一个单独的.rda文件中。

另外,如果您看看我发布的代码,是对r的初学者的归因和适用性评估,还是对我的熟练程度进行了评估?

1 个答案:

答案 0 :(得分:0)

如果没有一些虚拟数据,很难猜测您到底在做什么。但是在循环中包含循环并保存data.frame是很好的。首先,我在这里避免使用replicate函数,因为它的语法很奇怪,并且只使用普通循环。其次,您必须确保循环具有不同的索引(即for(i ...应该用for(j ...包围,因为函数可以在R中超出其范围。最后,请使用saveRDS而不是而不是save,因为您可以将每个对象(data.frame)保存在单独的.rds文件中。save函数旨在保存整个工作区,以便您可以选择在你离开的地方。

fun <- function(i){
  df <- data.frame(x=rnorm(5))
  names(df) <- paste0("x",i)
  df
}

for(j in 1:100){
  res <- data.frame(id=1:5)
  for(i in 1:10){
    res <- cbind(res, fun(i))
  }
  saveRDS(res, sprintf("replication_%s.rds",j))
}