我需要计算栅格堆栈中每个网格像元中非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)
Run Code Online (Sandbox Code Playgroud)
最后,它应该提供一个带有有效值数量(非NA)的栅格,例如
4 4 3
4 4 1
4 4 2
Run Code Online (Sandbox Code Playgroud)
更新:是的,最终栅格的范围应与原始堆栈相同。
该raster包定义了方法is.na,sum因此您可以直接使用它们:
rNA <- sum(!is.na(stacka))
Run Code Online (Sandbox Code Playgroud)
结果是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
Run Code Online (Sandbox Code Playgroud)
calc如果您需要更复杂的功能,您应该尝试。
您可以使用getValues和rowSums:
rowSums(!is.na(getValues(stacka)))
4 4 3 4 4 1 4 4 2
Run Code Online (Sandbox Code Playgroud)
并将其格式化为 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
Run Code Online (Sandbox Code Playgroud)
仅供参考
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5540 次 |
| 最近记录: |