2012-03-15 3 views
0

J'ai un fichier matriciel de couverture terrestre que j'ai réduit pour ne contenir que des cellules de couverture d'arbre. J'ai utilisé clump dans le package raster pour regrouper() des zones contiguës de forêt. Cela donne à toutes les cellules qui se touchent le même ID parce qu'elles font partie du même patch.
Je veux ensuite comprendre le PatchStat() pour chaque bloc, ce que je fais en convertissant mon raster clump en as.matrix. J'ai essayé d'obtenir le PatchStat() pour faire ceci au raster mais cela ne fonctionnerait que s'il était dans une matrice.Création d'un raster avec les valeurs PatchStat de SDMTools dans R

Je veux maintenant faire un raster avec la sortie de patch, à savoir "perim.area.ratio". Donc, chaque cellule qui correspond à clump 1, obtiendra la valeur perim.area.ratio qui correspond à clump 1. Pour ce faire, j'ai fait un data.frame() à partir de mon raster clump qui avait: lon, lat, layer(clumpID), cellID.
J'ai essayé de fusionner mes données raster cluster.name avec la sortie PatchStat en utilisant couche et patchID. Toutefois, une erreur se produit:

Erreur dans fix.by (by.x, x): 'by' doit spécifier des colonnes valides.

Des idées comment je pourrais faire autrement, ou pourquoi ces colonnes ne sont pas valides? Code ci-dessous.

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

Le fichier d'aide (http://rgm2.lab.nig.ac.jp/RGM2/func.php?rd_id=SDMTools:PatchStat) indique que: "une matrice de données avec des correctifs individuels identifiés comme avec ConnCompLabel; La matrice peut être un raster de classe 'asc' (paquet adehabitat), 'RasterLayer' (paquet raster) ou 'SpatialGridDataFrame' (paquet sp) ". Si vous travaillez avec RasterLayer (si vous utilisez 'raster', vous l'êtes probablement), vous pourriez éviter d'avoir à convertir en matrice et revenir en arrière. –

+0

Salut @RomanLustirk, merci pour la réponse. Oui, je travaille avec un 'RasterLayer', quand je vérifie les propriétés de mon raster, il le dit en haut. Cependant, cela ne fonctionne pas si je viens de mettre dans le raster, je reçois un message d'erreur ... Je ne sais pas pourquoi mais je ne pouvais pas comprendre cela non plus! Cheers, Adam – Adam

+0

Quel est le message d'erreur? 'r <- raster (ncols = 12, nrows = 12); r [] <- round (runif (ncell (r)) * 0,6); rc <- motte (r); PatchStat (rc) 'fonctionne pour moi. – jbaums

Répondre

1

La façon dont vous avez avons écrit, la fonction merge attend les deux trames de données à la fois une zone « couche » et une colonne « PatchID », alors qu'en fait vous avez l'intention de cartographier la colonne de couche de clumpdf à la colonne patchID de ps.data. Vous devez utiliser les arguments by.x et by.y.

L'appel correct serait:

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

Cependant, il y a une autre façon simple d'affecter les cellules de leur bouquet de 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'] 
}) 

Pour le briser pour vous (dans le cas où vous n'êtes pas particulièrement familier avec les fonctions apply), ce dernier bit identifie d'abord les indices de cellule de toutes les cellules avec des valeurs non-NA, et affecte ce vecteur à l'objet not.na. La fonction sapply attribue alors chaque valeur de not.na à son tour à x, et effectue l'étoffe entre les accolades (qui dans ce cas seulement renvoie la valeur perim.area.ratio trouvée dans la rangée de p qui a patchID égale à x). La fonction sapply renvoie un vecteur de ces valeurs perim.area.ratio, qui est ensuite affecté aux cellules non-NA de rc. En substance, il s'agit d'une opération de remplacement & de recherche, où les numéros de correctif sont remplacés par leurs perim.area.ratios correspondants.

Je devrais mentionner que cela peut ne pas fonctionner si vous avez une très grande grille.

Questions connexes