自动保存循环

时间:2018-08-29 16:44:26

标签: r loops save

我要自动执行以下代码。

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"))
}

除了循环以外,还有其他有效的方法吗?

2 个答案:

答案 0 :(得分:0)

您追求的可能是预先实例化数据集和调用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"))
  }
)

答案 1 :(得分:0)

修改:首先,效率是一个相对术语。您当前的方法有问题吗?编写此答案的前提是您要处理多个数据集(即使是同一原始集合的子集),但是从那时起,似乎list中的所有数据都是不可行的(由于数据大小) )。最后一个约束抵消了使用帧列表的优势,但我将在此处保留答案以供记录。


我建议处理list(参考: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是什么,而且我没有您的数据。我相信这个概念足够扎实。