我有一系列光栅图像的循环,我想提取等于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
}
答案 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