在一个栅格堆栈中计算非NA值的数量

6
我需要计算栅格堆栈中每个单元格中非NA值的数量。例如:
library(raster)
a1<-c(1,1,1,1,1,1,1,1,NA)
a2<-c(2,2,2,2,1,2,2,NA,2)
a3<-c(3,3,3,3,3,2,NA,NA,NA)
a4<-c(4,4,4,4,4,4,4,NA,4)
matrixa1<-matrix(a1,3,3)
matrixa2<-matrix(a2,3,3)
matrixa3<-matrix(a3,3,3)
matrixa4<-matrix(a4,3,3)
rastera1<-raster(matrixa1)
rastera2<-raster(matrixa2)
rastera3<-raster(matrixa3)
rastera4<-raster(matrixa4)
stacka<-stack(rastera1,rastera2,rastera3,rastera4)

最终应该生成一个栅格图层,其中包含有效值(非NA值)的数量,如下所示:
4 4 3
4 4 1
4 4 2

更新:是的,最终的栅格应该具有与原始堆栈相同的范围。
3个回答

8

raster包定义了is.nasum方法,因此您可以直接使用它们:

rNA <- sum(!is.na(stacka))    

结果是一个RasterLayer
> rNA
class       : RasterLayer 
dimensions  : 3, 3, 9  (nrow, ncol, ncell)
resolution  : 0.3333333, 0.3333333  (x, y)
extent      : 0, 1, 0, 1  (xmin, xmax, ymin, ymax)
coord. ref. : NA 
data source : in memory
names       : layer 
values      : 1, 4  (min, max)

> as.matrix(rNA)
     [,1] [,2] [,3]
[1,]    4    4    3
[2,]    4    4    1
[3,]    4    4    2

如果您需要更复杂的功能,建议尝试使用calc

6
您可以使用getValuesrowSums:
 rowSums(!is.na(getValues(stacka)))
 4 4 3 4 4 1 4 4 2

要将其格式化为 矩阵

matrix(rowSums(!is.na(getValues(stacka))),ncol=3,byrow=TRUE)
     [,1] [,2] [,3]
[1,]    4    4    3
[2,]    4    4    1
[3,]    4    4    2

请注意,
getValues(stacka)
      layer.1 layer.2 layer.3 layer.4
 [1,]       1       2       3       4
 [2,]       1       2       3       4
 [3,]       1       2      NA       4
 [4,]       1       2       3       4
 [5,]       1       1       3       4
 [6,]       1      NA      NA      NA
 [7,]       1       2       3       4
 [8,]       1       2       2       4
 [9,]      NA       2      NA       4

感谢您的帮助。虽然我无法在光栅化后绘制矩阵... - EDU

3
这是一种方法:
apply(as.array(stacka), 1:2, function(x) length(na.omit(x)))
#      [,1] [,2] [,3]
# [1,]    4    4    3
# [2,]    4    4    1
# [3,]    4    4    2

你为什么在问题中没有提到这一点呢?这正是你所要求的期望输出。 - Matthew Plourde
是的,抱歉我忘了提到最终光栅需要具有与原始堆栈相同的特性。 - EDU
将此输出包装在对 raster 的调用中? - Matthew Plourde
我之前尝试了一下,但似乎apply算法弄乱了范围。在执行raster()之后,范围现在变成了0,1,0,1。 - EDU
那也是你例子中stacka的范围。 - Matthew Plourde
是的,但当我处理“真实”数据集时,它也会输出0,1,0,1的范围。 - EDU

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接