2013-12-09 53 views
2

在R中,可以使用max/min命令轻松计算地理参照栅格堆栈中每个单元格的最大/最小值。在R中的栅格堆栈中找到第二高值R

set.seed(42) 
require(raster) 
r1 <- raster(nrows=10, ncols=10) 
r2=r3=r4=r1 
r1[]= runif(ncell(r1)) 
r2[]= runif(ncell(r1))+0.2 
r3[]= runif(ncell(r1))-0.2 
r4[]= runif(ncell(r1)) 
rs=stack(r1,r2,r3,r4) 
plot(rs) 
max(rs) 
min(rs) 

但是,我一直在试图找到一种方法来查找堆栈中第二高的值。就我而言,堆栈中的每个栅格表示特定模型在空间中的表现。我想比较第一和第二最佳值,以确定亚军的最佳模型,而不必将我的堆栈转换为矩阵,然后重新转换为栅格,从而获得最佳模型。任何想法或建议?

+0

'最大(RS [RS

+0

不幸的是,由于r没有定义的方法来使用您建议的语法对栈进行子集化,所以不起作用:'rs [rs

+0

是的,对不起 - 你必须对堆栈的属性进行一些强制操作。 –

回答

5

您可能会想要使用calc(),将以下代码修改为您的确切情况。为了说明它的工作原理与我所做的一样,我已经分别绘制了在4层对象的每个单元格中找到的最高,次高,第三和第四个最高值形成的图层。

zz <- range(cellStats(rs, range)) 

par(mfcol=c(2,2)) 
plot(calc(rs, fun=function(X,na.rm) X[order(X,decreasing=T)[1]]), main="1st",zlim=zz) 
plot(calc(rs, fun=function(X,na.rm) X[order(X,decreasing=T)[2]]), main="2nd",zlim=zz) 
plot(calc(rs, fun=function(X,na.rm) X[order(X,decreasing=T)[3]]), main="3rd",zlim=zz) 
plot(calc(rs, fun=function(X,na.rm) X[order(X,decreasing=T)[4]]), main="4th",zlim=zz) 

或者,更紧凑和高效,只是构造一个新的光栅堆保持重新排序的值,然后绘制它的层:

zz <- range(cellStats(rs, range)) 
rs_ord <- calc(rs, fun=function(X,na.rm) X[order(X,decreasing=T)]) 

par(mfcol=c(2,2)) 
plot(rs_ord[[1]], main="1st", zlim=zz) 
plot(rs_ord[[2]], main="2nd", zlim=zz) 
plot(rs_ord[[3]], main="3rd", zlim=zz) 
plot(rs_ord[[4]], main="4th", zlim=zz) 

enter image description here

+0

这很漂亮。我曾尝试栅格:calc函数,但没有得到它的工作。这正是我所需要的,同时在相似的情况下很容易使用。 –

+0

很好。我同意这很漂亮,并且每次使用**光栅**时都会有这种感觉。请注意将'na.rm'作为您通过'fun ='提供的任何函数的正式参数,即使它不会在函数体内的任何位置使用。 'calc()'具有检查并需要该名称参数的代码。 –

+1

我真的很敬畏Raster软件包的全面性。自从我发现它以来,我一直是同事使用它的强烈倡导者,并且经常畏惧我对Arcgis光栅计算器以及其他低劣,昂贵和封闭源替代品的长期和令人沮丧的过往经历......再次感谢。 –