2013-03-20 56 views
0

我想在第一個柵格中選擇小區域,並計算該區域的空間平均值,併爲其他11個柵格執行相同操作。所以最終會得到12個值。如何提取並計算某些區域形式柵格的均值?

我嘗試這樣做:

sami<- list.files("C:\\New folder (3)", "*.envi", full.names = TRUE) 
saf=stack(sami) 
plot(saf, 1) ## to select a region 
e <- drawExtent()## I selected the region 
saf_test <- crop(saf, e) 

這是正確的這樣做呢?

然後我如何計算所選區域的空間平均值?並對所有其他柵格進行相同操作。 在此先感謝。

+0

請您的情況可重複的,即我們提供以及模仿你的情況所需的數據和代碼。有關如何執行此操作的更多提示,請參閱http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example。 – 2013-03-20 11:11:00

+0

您是否嘗試使用柵格庫中的區域統計信息? zonal(x,z,stat ='mean',digits = 0,na.rm = TRUE,...) – 2013-03-20 11:14:51

+0

'stackApply'你可以使用'extent'來選擇區域。這將使其更具可重複性(從長遠來看更容易)。您可以檢查光柵小插圖以獲取有關如何生成一些示例數據以使問題可重現的一些提示。 – 2013-03-20 11:16:19

回答

1

你可以這樣做。我使用raster包中的一些示例數據。嘗試一下並將其應用於柵格堆棧(這應該很容易)。 extract函數將返回一個矩陣。通過drawExtent每一層選擇的區域值的一列,然後你可以使用colMeans該區域的平均:

#This particular stack has 3 'layers' - one each for the red, green and blue channels of the picture 
    saf <- stack(system.file("external/rlogo.grd", package="raster")) 
    plotRGB(saf) 
    e <- drawExtent() 

enter image description here

vals <- extract(saf , e , nl = nlayers(saf)) 
    vals <- colMeans(vals) 
    vals 
# red green  blue 
# 185.9368 191.9158 208.7825 
+0

您可以手動創建擴展盤區對象。如果你畫出範圍,然後在控制檯中輸入「e」(或任何你稱之爲範圍的),它會調出你的範圍的值。現在,在你的代碼中使用這些值來創建一個像這樣的範圍......'e < - extent(xmin,xmax,ymin,ymax)'以指定的順序輸入正確的值。那有意義嗎? – 2013-03-20 12:33:24

+0

@ZadSim好悲傷,總是有更多的問題,仍然沒有接受或upvote?! 'plot(saf)','plot(e,add = TRUE)' – 2013-03-20 12:42:08

+0

@ZadSim謝謝! :-),也得到程度的精確值,你可能想要做的'è< - drawExtent()','然後粘貼(E @ XMIN)','膏(E @ XMAX)'等 – 2013-03-20 12:45:12