2013-12-09 52 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光柵計算器以及其他低劣,昂貴和封閉源替代品的長期和令人沮喪的過往經歷......再次感謝。 –