如何在栅格堆栈之间执行操作并对 R 中的所有文件夹重复操作?

How to perform operations between raster stacks and repeat the operations to all the folders in R?

我是 R 的新用户。我的问题与最近关于 堆栈溢出 website:How 的问题有关,以从 R 中各个子文件夹中包含的文件堆叠各个栅格图层? 。我使用了为我自己的案例提供的答案。我有几个包含几个光栅文件的文件夹。每个文件夹的文件描述都相同。为简化起见,我有两个文件夹 AB,每个文件夹包含 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"

我使用了上一题提供的代码(见link):

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 中将具有模式 "snow" 的光栅堆栈与具有模式 '"rain" 的光栅堆栈相乘,并对文件夹 B 执行相同的操作。

我尝试了以下代码:

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

每个文件夹 A 和 B 应该有 8 个新的光栅文件。

然后我想在每个文件夹中写入从raster.multiply获得的文件。

然而,对于最后一行代码,我得到了以下错误:

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

我是 R 的新手,我还在探索。

您将无法像那样将生成的栅格列表相乘,因此会出现错误(去调查列表)。

但您可以轻松堆叠堆栈列表:

# 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