2014-01-13 36 views
0

which.max函数I有两个光栅与数据如下:修改中的R

library("raster") 
mdata <- raster(matrix(c(0,2,3, 11,12,13), nrow = 2, ncol = 3, byrow = TRUE)) 
ndata <- raster(matrix(c(0,1,2, 11,14,13), nrow = 2, ncol = 3, byrow = TRUE)) 

欲堆叠起来,并估计与该标准的最大位置,如果这两个光栅具有0值时,我应该能够写入0.这意味着在这种情况下输出栅格/矩阵应该有0,1或2。

我尝试了下面的代码,但它并没有完全按照我想要的方式执行。

odata <- stack(mdata, ndata) 
e <- which.max(odata) 

我应该如何引入检查两个矩阵的值是否为0的标准,如果存在,则分配0?

我真的很感谢你对此的反馈。谢谢!

+0

PLease定义“最大位置”,并提供输出样本输出矩阵(零点,一点和二点)的示例。否则,只需设置'summat <-sum(mdata,ndata)'并检查值为零的值就足够了。 –

+0

用给定的矩阵mdata和ndata以上,which.max(odata)会给我一个矩阵(c(1,1,1,1,2,1))。 2在这种情况下指示第二光栅(即,ndata)对于[2,2]位置具有较高的值。如果两个矩阵具有相同的值,则将输出矩阵分配为1,即,第一矩阵的位置。我想要得到矩阵值为c(0,1,1,1,2,1)的结果。这基本上类似于我已经通过which.max函数获得的结果,除了我想为两个矩阵分配具有0的单元格以及0不与1。 –

+0

我试图在逐个单元格基础上确定位置在一组栅格中具有最大值的栅格。如果我只有两个栅格,你的解决方案似乎工作。但是,我有27个栅格进行比较,并创建一个光栅,其中栅格的位置在27个栅格中具有最大值。所以,我试图堆叠栅格图层,并使用which.max函数来部分满足我的目标。我只是无法弄清楚如何满足条件,如果所有栅格在相同位置都有0,我需要分配0。 –

回答

0

如何:

Rgames> foo<-matrix(rep(1,6),nr=2,nc=3) 
Rgames> foo 
    [,1] [,2] [,3] 
[1,] 1 1 1 
[2,] 1 1 1 
Rgames> foo[(ndata-mdata >0)] <-2 
Rgames> foo[(mdata==0 & ndata==0)] <-0 

Rgames> foo 
    [,1] [,2] [,3] 
[1,] 0 1 1 
[2,] 1 2 1 

我仍然无法从你的问题告诉你是否要找到最大的mdata或所有位置,其中mdata>ndata,但如果你澄清,很容易修改的条件语句匹配。

编辑:讨论扩展到N栅格图层。 要找到哪个图层在每个位置都有最大值,我可以使用array

cube <- array(c(data.1,data.2,...),dim=c(dim(data.1),N)) #for N layers 

# and I apologize but I may have loaded this 3-D cube in the wrong order 
maxvals<-array(dim=dim(data.1)) 
for (j in 1:dim(data.1)[1]) { 
for (k in 1:dim(data.1)[2]) { 
maxvals[j,k]<-which.max(cube[j,k,]) 
if(sum(cube[j,k,])==0) maxvals[j,k] <- 0 
} 
} 

这或许可以更有效地做了许多工作aggregateplyr工具,但我希望这指明了方向。

+0

感谢Carl提供的解决方案。实际上,我最终创建了一个全零的矩阵,并在堆叠时保留它。例如。 odata < - stack(zeromatrix,mdata,ndata);并使用e < - which.max(odata)。这种方式的作用是每当所有栅格都为零时,它会自动将它分配给1,因为它首先出现,依此类推。通过这种方式,我得到了具有更高值的栅格位置的矩阵。然后我重新命名矩阵的值为1:3到0:2。它完美运作。再次感谢帮助我。 –