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

时间:2018-06-12 19:22:40

标签: r file directory raster operation

我是R的新用户。我的问题仅针对stack overflow website:How to stack individual raster layers from files contained in individual subfolders in 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))
})

我想在每个文件夹中执行calculis。例如,我想在文件夹A中将光栅堆叠与模式&#34; snow&#34;相乘。使用带有模式&#39;&#34; rain&#34;的光栅堆栈,以及为文件夹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的新人,我还在探索。

1 个答案:

答案 0 :(得分:0)

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