我有 163 个光栅文件想要使用 for 循环聚合从 50 公里到 100 公里的分辨率。请指导我。谢谢

Posted

技术标签:

【中文标题】我有 163 个光栅文件想要使用 for 循环聚合从 50 公里到 100 公里的分辨率。请指导我。谢谢【英文标题】:I have 163 raster files want to aggregate from 50 km to 100 km resolution using for loop. please guide me. thanks 【发布时间】:2020-04-11 07:41:17 【问题描述】:
library(raster)
library(stringr)
setwd("file.choose")
tws50km =list.files(pattern=".tif",full.names = F)
time_list <- str_sub(gsub("-", "", seq(as.Date("2002/4/1"), by = "month", length.out = 163)), 1,6)

for (i in 1:length(tws50km))
   tws100km = aggregate(i, fact = 2, fun = mean)
   writeRaster(tws100km,paste('tws_',time_list[i], ".tif", sep = " "), "GTiff", overwrite=TRUE) 

match.fun(FUN) 中的错误:缺少参数“FUN”,没有默认值

【问题讨论】:

如果你把aggregate(i改成aggregate(tws50km[i]? 仍然无法正常工作。 我会尝试罗伯特的答案,因为他写了raster 【参考方案1】:

应该是这样的

library(raster)
inf <- list.files(pattern=".tif",full.names = F)

按步骤生成所有输出文件名是最简单的,如下所示。但是你所做的看起来并不好。你怎么知道你使用了正确的文件名,它们与数据匹配?您通常会以某种方式更改输入文件名inf。但是我无法改进您的方法,因为您没有显示任何输入文件名。

outf <- substr(gsub("-", "", seq(as.Date("2002/4/1"), by="month", length.out=163)), 1,6)
# use paste0, avoid spaces in filenames
outf <- paste0('tws_', outf, ".tif")
outf[1:2]
#[1] "tws_200204.tif" "tws_200205.tif"

现在循环。首先使用光栅创建一个 RasterLayer(如果有多个图层,则使用 brick),然后聚合该对象(您不能聚合文件名!)。不需要writeRaster,因为聚合有自己的filename 参数。

for (i in 1:length(inf)) 
    r <- raster(inf[i])
    x <- aggregate(r, fact=2, fun=mean, filename=outf[i], overwrite=TRUE) 

【讨论】:

【参考方案2】:

您的日期代码很好,当我发表评论时我并没有充分考虑,但是您需要在循环过程中逐步更新所有内容,因此我们会将 [i] 放在从 1- 开始的任何地方2-3~163

library(raster)
library(stringr)
setwd("file.choose")
tws50km =list.files(pattern=".tif",full.names = F)

我确实在此处和循环中将time_list 更改为time_month,因为 将来您会想知道这是一个由 [,而不是[[访问的列表

time_month <- str_sub(gsub("-", "", seq(as.Date("2002/4/1"), by = "month", length.out = 163)), 1,6)

所以只需复制你的 for 循环并思考[i]

for (i in 1:length(tws50km))
   tws100km[i] = aggregate(tws50km[i], fact = 2, fun = mean)
   writeRaster(tws100km[i],paste('tws_',time_month[i], ".tif", sep = " "), "GTiff", overwrite=TRUE) 

希望这样做。

【讨论】:

感谢您的回答。但它没有用。我已经得到了一个解决我问题的答案。 @ShoaibAli 您应该接受上面罗伯特的回答,因为它表明这个问题已得到解答并可以帮助未来的用户。 是的,我接受了罗伯特的回答,并在上面的评论中表示感谢。

以上是关于我有 163 个光栅文件想要使用 for 循环聚合从 50 公里到 100 公里的分辨率。请指导我。谢谢的主要内容,如果未能解决你的问题,请参考以下文章

使用光栅 PTR 打印机在 java 中打印文件

ftp echo批处理命令,想要用for循环传递多个文件

计算几个不同程度的光栅文件的中位数

处理多个光栅文件并对其执行单位转换:R

如何在R中的For循环中创建动态变量名称

Pandas:自定义 WMAPE 函数聚合函数到多列而没有 for 循环?