【问题标题】:Increment Loop in Batches批量递增循环
【发布时间】:2016-07-26 14:14:55
【问题描述】:

我希望有人可以帮助我处理我正在使用的循环函数。我尝试过广泛搜索 Google 和 Stack Overflow,但由于我不知道确切的搜索术语,我担心我会遗漏一些结果。考虑到这一点,如果这个问题已经被问到,我提前道歉,但我希望有人能指出我正确的解决方案。

关于我的数据

我已经从 NASA 的 MODIS 卫星下载了 1000 多个文件。由于我的研究区域面积很大,我不得不下载 6 个瓦片区域的数据。结果,我的下载文件列表实际上以 6 个为一组“分组”在一起(尽管在资源管理器中仅显示为文件列表)。

我在 R 中编写了一些简单的 for 循环来进行一些初始处理(在下面的示例中,这是对图块重新采样,以便可以使用 raster::mosaic 将它们缝合在一起。这种处理可以单独发生在文件上在这个阶段,所以我发现下面的循环非常适合我的需求:

resampled.raster<-list()

for (l in 1:24){
  cat(l,"\n")
  resampled.raster[[l]]<-resample(rst[[l]], s, method="ngb")
}

问题

我的处理的下一个阶段要求我将栅格以 6 个为一组进行镶嵌,然后再进入下一批 6 个。例如,如果我有一个包含 24 个文件的列表,则需要将前 6 个文件处理为一组文件,然后保存(在列表中),然后再移动到下一个 6。经过 4 次迭代(总共 24 个文件),我需要停止循环。

我通过搜索互联网找到的最接近的解决方案是here,但这不是我的问题的解决方案。

在 R 中使用 for 循环是否可以进行这种“批处理”处理?非常感谢您的帮助。

【问题讨论】:

  • 我从未使用过raster,但要选择一个批次,您可以执行以下操作:step &lt;- 6for(i in seq(1,24,step )),然后在循环内batchIndex &lt;- i:(i+step)
  • 您可以使用按批次分组的文件名列表制作 .txt 文件
  • 感谢两位cmets。以下 RobertH 的解决方案有效,我已接受此答案。

标签: r loops raster r-raster


【解决方案1】:

首先请注意,使用resamplemosaic 几乎肯定是错误的。如果这些是图块,您应该能够使用merge 来合并它们。

需要分组的文件名肯定有什么独特之处吗?这就是你需要使用的。

获取带有文件名的向量

# ff <- list.files()

这是一个玩具示例

ff <- c('fileA1', 'fileA2', 'fileB1', 'fileB2') 

获取唯一组

code <- gsub('file', '', ff)
code <- substr(code, 1, 1)
uc <- unique(code)

遍历组

for (u in uc) {
    files <- ff[u == code]
    r <- lapply(files, raster)
    r$filename <- paste0("merged/", u, ".tif")
    m <- do.call(merge, r)
}

【讨论】:

  • 您好罗伯特,非常感谢您的帮助。这是一个非常优雅的解决方案,并且效果很好。我还是编程新手,所以像这样的详细答案确实帮助我了解正在发生的事情。再次感谢您的宝贵时间。
  • 如果将来有人会觉得这很有帮助,这里有一些额外的信息。正如 RobertH 所问的,文件名有一些独特之处。每个文件的名称如下:MOD15A2.A2016169.h09v07.005.2016183085001 使用上面详述的罗伯特代码,我删除了“MOD15A2”。并继续使用文件名中接下来的 8 个字符作为唯一标识符(在本例中为 A22016169)由于我的数据跨越全球 6 个图块,因此有六个文件,每个文件都包含 A2016169。这些是合并的 6 个文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-10
  • 2021-09-06
  • 2018-12-02
  • 2011-10-15
  • 2012-09-22
  • 1970-01-01
相关资源
最近更新 更多