【问题标题】:Automate saving in loop自动循环保存
【发布时间】:2018-08-29 16:44:25
【问题描述】:

我想自动化下面的代码。

df.f1 <- c2d(fdat.s1, 1, 15000)
save(df.f1,file="../RESULTS/nl_final__df_1_1.rda")
df.f2 <- c2d(fdat.s1, 15000, 30000)
save(df.f2,file="../RESULTS/nl_final__df_1_2.rda")
df.f3 <- c2d(fdat.s1, 30000, 45000)
save(df.f3,file="../RESULTS/nl_final__df_1_3.rda")

我试过这样做。但我正在努力解决如何在循环中自动更改 df.f1 。

vec <- c(1,15000,30000,45000)
for(i in 1:3){
  df.f1 <- c2d(fdat.s1, vec[i], vec[i+1])
  save(df.f1,file=paste("../RESULTS/nl_mod_df_1_",i,".rda"))
}

除了循环还有什么有效的方法吗?

【问题讨论】:

标签: r loops save


【解决方案1】:

也许你想要的是预实例化数据集和调用get 的组合?

df.f1 <- c2d(fdat.s1, 1, 15000)
df.f2 <- c2d(fdat.s1, 15000, 30000)
df.f3 <- c2d(fdat.s1, 30000, 45000)

lapply(
  c(1, 2, 3),
  function(i){
    save(get(paste0("df.f", i)), file = paste("../RESULTS/nl_mod_df_1_", i, ".rda"))
  }
)

【讨论】:

    【解决方案2】:

    编辑:首先,效率是一个相对术语。你现在的方法有问题吗?这个答案是在您使用多个数据集(即使是同一原始集的子集)进行操作的前提下编写的,但从那时起,使用list 中的所有数据似乎是站不住脚的(由于数据大小)。最后一个约束否定了使用框架列表的优势,但我将在此处保留答案以作记录。


    我建议处理lists(参考:How do I make a list of data frames?)。此外,它可以通过mapply 完成。

    首先让我们制作一个“中断”的向量(就像你做的那样):

    brks <- seq(0L, 45000L, by=15000L)
    brks
    # [1]     0 15000 30000 45000
    

    (“如何”生成它并不重要,只是你有一个包含每个断点的向量,包括第一个和最后一个。)我们将使用“除了最后一个”和“除了第一个之外的所有”在两个单独的向量中,所以你可以看到我们将跨越每个的第一个元素,然后是每个的第二个元素,等等:

    brks[-length(brks)]
    # [1]     0 15000 30000
    brks[-1]
    # [1] 15000 30000 45000
    

    不过,这在技术上不是必需的。我的假设是您的范围应该是连续的,因此使用向量来处理将保证连续性并防止更新一个向量而不是另一个向量。你当然可以做(而不是)两个独立的向量。

    mapply 是一个类似“拉链”的函数,其中mapply(fun, 1:3, 11:13, SIMPLIFY=FALSE) 实际上是list(fun(1,11), fun(2,12), fun(3,13))

    ret <- mapply(function(a,b) c2d(fdat.s1, a, b),
                  brks[-length(brks)], brks[-1],
                  SIMPLIFY=FALSE)
    

    (SIMPLIFY=FALSE 将其保留为list。如果有机会,*apply 的许多功能就像将事物简化为向量或矩阵,如果这不是您所期望的,这可能会出现问题。进一步更复杂的是,我们看到 sapply(..., simplify=FALSE)mapply(..., SIMPLIFY=FALSE),所以每个选项略有不同。)

    此时,您可以遍历数据并做任何您需要的事情,包括:

    mapply(function(dat, nm) save(dat, file=nm),
           ret, sprintf("../RESULTS/nl_mod_df_1_%d.rda", brks[-length(brks)]))
    

    购买者告诫:未经测试,因为我不知道c2d 是什么,而且我没有你的数据。我相信这个概念已经足够扎实了。

    【讨论】:

    • 感谢您的回答。如果我理解正确,您将使用 mapply 将所有内容保存在列表中。如果是,那么这是一个问题。这些是巨大的文件 (GB),对于我的计算机来说,这个列表会很大。因此,我将 1:45000 分成 3 个部分。并单独保存。
    • 那么对c2d(...)的单数调用可以变成一个复合的save(c2d(...),file="...")。这表明mapply(function(a,b,nm) save(c2d(...),file=nm), brks[...], brks[...], sprintf(...))
    猜你喜欢
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多