光栅系列总和

时间:2017-03-05 17:56:50

标签: r

我有一系列光栅图像的循环,我想提取等于150的值,然后添加整个循环长度的像素总数。使用我只能设法获得每个图像的总值而不是总体形式的代码。感谢

   m=52419 #total pixels basin
   for(i in 1:4){
   b1<-raster(myras1[i])
   bc = b1 == 150 #Values eq 150
   nbc = cellStats(bc,stat="sum")
   print(nbc)
   [1] 34962
   [1] 38729
   [1] 52389
   [1] 52176
   pc=nbc*100/m
   }

1 个答案:

答案 0 :(得分:1)

一般情况下,建议不要在R中使用循环来容易地进行矢量化。我没有试图解决你的循环中的(几个)问题,而是展示了一种更好的方法。您可以在单个矢量化行中执行整个计算:

sum(cellStats(myras1==150, stat="sum")) * 100/m

打破这一点:在光栅堆栈上执行的cellStats将返回一个值向量,每层一个。 sum然后将这些添加到一起。然后我们除以整个堆栈中的单元格数(所有层组合)并乘以100以转换为percnetage。

在一些可重现的虚拟测试数据上进行测试:

set.seed(123)
myras1 = list(
  raster(nrows = 100, ncols = 100, vals = sample(140:150,10000,T)),
  raster(nrows = 100, ncols = 100, vals = sample(140:150,10000,T)),
  raster(nrows = 100, ncols = 100, vals = sample(140:150,10000,T)),
  raster(nrows = 100, ncols = 100, vals = sample(140:150,10000,T))
)
myras1 = stack(myras1)
m = ncol(myras1) * nrow(myras1) * nlayers(myras1)

sum(cellStats(myras1==150, stat="sum")) * 100/m
# [1] 8.815