我要自动执行以下代码。
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"))
}
除了循环以外,还有其他有效的方法吗?
答案 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
是什么,而且我没有您的数据。我相信这个概念足够扎实。