在R中,我可以使用max / min命令轻松计算地理配准光栅堆栈中每个像元的最大/最小值。
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 :(得分:5)
您可能希望使用calc()
,根据您的具体情况调整以下代码。为了表明它的工作原理,我已经分别绘制了由4层RasterStack
对象的每个单元格中的最高,第二高,第三和第四高值形成的层。
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)