2012-03-15 64 views
0

我有一個土地覆蓋的柵格文件,我已經減少到僅包含樹木覆蓋單元。我在柵格包中使用了clump來聚集()一起連續的森林區域。這使得所有單元格相互接觸相同的ID,因爲它們是同一個補丁的一部分。
然後我想找出每個叢塊的PatchStat(),我通過將我的叢塊柵格轉換爲as.matrix來完成。我試圖讓PatchStat()對柵格執行此操作,但只有在矩陣中才有效。使用R中的SDMTools的PatchStat值創建柵格

我現在想用補丁stat輸出做一個光柵,即「perim.area.ratio」。因此,每個對應於叢1的單元格將獲得與叢1相對應的perim.area.ratio值。爲此,我從我的叢塊柵格中創建了一個data.frame():lon, lat, layer(clumpID), cellID
我試圖合併我的clump柵格data.frame與PatchStat輸出使用patchID。但是,發生錯誤:

fix.by(by.x,x)中的錯誤:'by'必須指定有效的列。

任何想法,我可以這樣做另一種方式,或爲什麼這些列無效?下面的代碼。

clump <- raster(file.choose()) 
library(SDMTools) 
clumpval <- rasterToPoints(clump) 
clumpcell <- cellFromXY(clump, clumpval[, c('x', 'y')]) 
clumpdf <- data.frame(clumpval, clumpcell) 
ps.data <- PatchStat(as.matrix(clump)) 
merged.data.all <- merge(clumpdf, ps.data1, by=c("layer", "patchID")) 
+0

幫助文件(http://rgm2.lab.nig.ac.jp/RGM2/func.php?rd_id=SDMTools:PatchStat)表示:「一個帶有ConnCompLabel標識的單個補丁的數據矩陣;矩陣可以是'asc'(adehabitat包),'RasterLayer'(光柵包)或'SpatialGridDataFrame'(sp包)「類的光柵。如果你正在使用RasterLayer(如果你使用'raster',你可能是),你可以避免必須轉換爲矩陣並返回。 – 2012-03-15 08:19:28

+0

Hi @RomanLustirk,感謝您的回覆。是的,我正在使用'RasterLayer',當我檢查我的柵格的屬性時,它會在頂部顯示它。但是,如果我只是放入柵格,它就不起作用,我收到錯誤信息......不知道爲什麼,但無法弄清楚這一點!乾杯,亞當 – Adam 2012-03-15 09:59:17

+0

什麼是錯誤信息? 'r < - raster(ncols = 12,nrows = 12); r [] < - round(runif(ncell(r))* 0.6); rc < - clump(r); PatchStat(rc)'適合我。 – jbaums 2012-03-15 13:01:56

回答

1

你編碼的方式,將merge函數需要兩個數據幀,同時擁有「層」字段一個「patchID」一欄,而實際上你打算層列映射的clumpdf添加到ps.data的patchID列中。您需要使用by.xby.y參數。

正確的調用是:

merged.data.all <- merge(clumpdf, ps.data, by.x='layer', by.y="patchID") 

然而,有分配細胞的另一種簡單的方法,他們的叢的perim.area.ratio

library(raster) 
library(SDMTools) 

# create a random raster 
r <- raster(ncols=200, nrows=200) 
r[] <- rbinom(ncell(r), 1, 0.5) 

# clump it 
rc <- clump(r) 

# get patch stats 
p <- PatchStat(rc) 

# Replace each non-NA value of rc with the corresponding clump perim.area.ratio. 
not.na <- Which(!is.na(rc), cells=TRUE) 
rc[not.na] <- sapply(rc[not.na], function(x) { 
    p[p$patchID==x, 'perim.area.ratio'] 
}) 

打破它,你(如果你不是特別熟悉apply函數),該最後一位首先標識具有非NA值的所有單元的單元索引,並將該向量分配給對象not.na。所述sapply函數然後分配的not.na依次x每個值,並且執行大括號之間的東西(在此情況下僅返回的p行具有patchID等於x中發現的perim.area.ratio值)。 sapply函數返回這些值的向量,然後將其分配給rc的非NA單元。實質上,這是一個發現&替換操作,其中補丁號碼被替換爲其對應的perim.area.ratios

我應該提到,如果你有一個非常大的網格,這可能無法正常工作。