2013-06-25 2 views
3

Мне нужно подсчитать количество значений не-NA в каждой ячейке ячейки в стеке растра. Например:R: подсчитать не-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) 

В конце концов он должен придумать растр с числом допустимого значения (не Nas) как

4 4 3 
4 4 1 
4 4 2 

Update: да конечный растр должен иметь такой же степени, как оригинал стек.

ответ

4

Вы можете использовать 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 

FYI,

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 
+0

Спасибо за помощь. Хотя я не мог построить матрицу, даже после растрирования ее ... – 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 
+0

Почему вы не упомянули об этом в своем вопросе? Это именно тот желаемый результат, который вы просили. –

+0

Да, извините, я забыл упомянуть, что окончательный растровый желателен иметь те же характеристики, что и исходный стек. – EDU

+0

завершите вывод этого в вызове 'растр'? –

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 если вам нужно более сложные функции.