Как выполнить операции между растровыми стеками и повторить операции для всех папок в R? - PullRequest
0 голосов
/ 12 июня 2018

Я новый пользователь R. Мои вопросы закрыты для недавно заданных вопросов на веб-сайте переполнения стека: как составлять отдельные растровые слои из файлов, содержащихся в отдельных подпапках в R?.Я использовал ответы, предоставленные для моего собственного случая.У меня есть несколько папок, содержащих несколько растровых файлов.Описание файлов одинаково для каждой папки.Для упрощения у меня есть две папки A и B , содержащие каждые 16 растровых файлов.Либо папка A, либо B, растровые файлы имеют одинаковый тип имени, поэтому их можно идентифицировать по шаблонам.

                        |----8 raster files pattern "snow"
              Folder A- |      
              |         |----8 raster files pattern "rain"
parent_folder-|
              |        |----8 raster files pattern "snow"
              Folder B-|      
                       |----8 raster files pattern "rain"

Я использовал код, указанный в последнем вопросе (см. Ссылку):

list_dirs <- list.dirs("path/parentfolder/", recursive = F)

names(list_dirs) <- basename(list_dirs)


# create two stacks with the pattern "snow" for the folders A and B, respectively

raster.list.snow <- lapply(list_dirs, function(dir) {
stack(list.files(dir, pattern = "snow", full.names = T, recursive = F))
})

# create two stacks with the pattern "rain" for the folders A and B, respectively

raster.list.rain <- lapply(list_dirs, function(dir) {
stack(list.files(dir, pattern = "rain", full.names = T, recursive = F))
})

Я хотел бы выполнить вычисления в каждой папке.Например, я хотел бы в папке A умножить стек растров с шаблоном «снег» на стек растров с шаблоном «дождь» и сделать то же самое для папки B.

Iпопробовал следующий код:

   raster.multiply<- raster.list.snow * raster.list.rain

У меня должно быть 8 новых растровых файлов для каждой папки A и B.

Затем я хотел бы записать в каждую папку файлы, полученные из raster.multiply,

Однако для последней строки кода я получил следующую ошибку:

 Error in raster.list.snow * raster.list.rain : 
 non-numeric argument to binary operator

Я очень новичок в R и все еще изучаю.

1 Ответ

0 голосов
/ 13 июня 2018

yuo не сможет умножить итоговые списки растров вместе, как это, отсюда и ошибка (изучите списки).

, но вы можете легко составлять списки стеков:

# make some dummy rasters
a <- raster(xmn=0,xmx=5,ymn=0,ymx=5,res=1)
a[] <- sample(1:5,25,replace=T)
b <- raster(xmn=0,xmx=5,ymn=0,ymx=5,res=1)
b[] <- sample(1:5,25,replace=T)
c <- raster(xmn=0,xmx=5,ymn=0,ymx=5,res=1)
c[] <- sample(1:5,25,replace=T)
d <- raster(xmn=0,xmx=5,ymn=0,ymx=5,res=1)
d[] <- sample(1:5,25,replace=T)

# imagine st1 and st2 are rain rasters, st3 and st4 are snow
st1 <- stack(a,b,c,d)
st2 <- stack(d,a,c,b)
st3 <- stack(c,b,a,d)
st4 <- stack(a,d,b,c)

# make the rain and snow lists, just like your code above. we have a list object of two stacks.
list1 <- list(st1,st2)
list2 <- list(st3,st4)

# error below
list1 * list2
Error in list1 * list2 : non-numeric argument to binary operator

# however, stack them and multiply:
stack(list1) * stack(list2)

# check e.g.
identical(getValues(stack(list1)[[1]]),getValues(a))
[1] TRUE
...