У меня есть 163 растровых файла, которые нужно агрегировать с разрешением от 50 км до 100 км, используя для l oop. пожалуйста, направь меня. Спасибо - PullRequest
0 голосов
/ 11 апреля 2020
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" без значения по умолчанию

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Должно быть что-то вроде этого

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"

Теперь l oop. Сначала создайте 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) 
}
0 голосов
/ 11 апреля 2020

Ваш код даты просто в порядке, и я не думал полностью, когда я прокомментировал, но вам нужно постепенно обновлять все, как вы go через ваш l oop, так что мы поместим [i] везде, где переходят с 1-2-3 ~ 163

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

Я изменил time_list на time_month как здесь, так и в l oop, потому что в будущем вы захотите знать, что это - это символьный вектор, к которому обращается [, а не список, к которому обращается [[

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

Так что просто скопируйте ваш код для l oop и подумайте [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) 
}

и, надеюсь, это сделает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...