[英]R: count non-NAs in a raster stack
我需要計算柵格堆棧中每個網格單元格中的非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
更新:是的,最終的柵格應該與原始堆棧具有相同的范圍。
您可以使用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
這是一種方式:
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
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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.