我需要计算栅格堆栈中每个网格单元格中的非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
更新:是的,最终的栅格应该与原始堆栈具有相同的范围。
答案 0 :(得分:5)
您可以使用getValues
和rowSums
:
rowSums(!is.na(getValues(stacka)))
4 4 3 4 4 1 4 4 2
并将其格式化为matrix
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
答案 1 :(得分: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
答案 2 :(得分:3)
raster
包定义了is.na
和sum
的方法,因此您可以直接使用它们:
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
。