2012-03-08 4 views
1

J'essaie de compter le nombre de groupes de dépressions (valeurs négatives) d'un ensemble de données climatiques et d'avoir moins d'idée sur la façon de s'y prendre . Permettez-moi d'expliquer le scénario. J'ai une brique raster avec 468 couches et chaque couche a 7458 cellules.compter les dépressions (groupe de nombres négatifs) dans le temps à partir d'une brique raster, R

> cntneg 
class  : RasterBrick 
dimensions : 66, 113, 7458, 468 (nrow, ncol, ncell, nlayers) 
resolution : 0.108, 0.108 (x, y) 
extent  : 77.946, 90.15, 24.946, 32.074 (xmin, xmax, ymin, ymax) 
coord. ref. : NA 
values  : in memory 
min values : -359.51 -341.21 -315.45 -148.10 -187.39 -52.87 -66.72 -52.17 -286.81 -306.74 ... 
max values : -7.589 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 ... 

Maintenant, par exemple, permet de prendre le pixel 5000e

> cntneg[5000] 

Ce qui va me donner 468 valeurs de ce pixel au fil du temps.

[1] -90.795107 -89.990016 -94.840754 0.000000 -15.085517 0.000000 
    [7] 0.000000 0.000000 0.000000 -12.469657 -114.757702 -115.372023 
[13] -107.194478 -92.916680 -115.105817 -113.205776 -115.003430 -62.175070 
[19] 0.000000 0.000000 0.000000 -72.358073 -105.006508 -115.372023 
[25] -48.836959 -102.314928 -113.271826 -115.372023 -79.530055 0.000000 
[31] 0.000000 0.000000 0.000000 -15.048987 -115.208204 -115.372023 
[37] -115.003430 -108.757617 -113.122594 -115.372023 -111.699048 -17.618498 
[43] 0.000000 0.000000 

Maintenant ici je dois faire deux tâches

1) numéro de nombre de fois que la pluie est allé en dessous de la moyenne - ceux dont les valeurs négatives. Et les zéros ont des valeurs RF positives (que j'ai converties en zéro en reclassant) pour faciliter le calcul. Dans l'exemple ci-dessus, je veux choisir le groupe de nombres négatifs et compter. à savoir, (-90,795107 -89,990016 -94,840754), (-15,085517), (-12,469657 -114,757702 -115,372023, -107,194478 -92,916680 -115,105817 -113,205776 -115,003430 -62,175070), (-72,358073 -105,006508 -115,372023, -48,836959 -102,314928 -113.271826 -115.372023 -79.530055) etc. La valeur de pixel de couche résultante devrait être le nombre de ces groupes, qui dans ce cas est 5. Comme sage doit faire pour tous les pixels le long de la dimension de temps.

2) Pour chaque groupe je veux choisir les valeurs minimales et le pixel obtenu aura la somme de ces valeurs minimales. Si un groupe a une valeur, gardez la même chose.

Je suis bloqué pour commencer avec ce processus. Je suppose que j'ai besoin de convertir la brique en dataframe et le faire.

Quelqu'un peut-il m'aider à donner l'exemple?

Vraiment apprécier toute aide. Désolé, si l'explication est confuse.

Cordialement SP

Répondre

0

Il y a une fonction appelée belle rle qui trouve des éléments contigus d'un vecteur satisfaisant une condition. L'appel de fonction res<-rle(vector<0) renvoie res$lengths et res$values, contenant la longueur et la valeur des blocs dans votre vecteur, respectivement.

Ainsi, nous pouvons le faire comme ça

sample.data <- rnorm(20) 
    b <- (1:length(rle(sample.data<0)$lengths)) 
    c <- rle(sample.data<0)$lengths 
    aggregate(sample.data,by = list(unlist(mapply(rep,b,c))),min) 

(Désolé pour la liste (unlist()), apparemment, je ne sais pas comment plaquer une liste dans R)

La commande mapply crée une liste d'identifiants pour chaque bloc, numéroté de 1 au nombre total de blocs. La commande rep assure que chaque identifiant est répété aussi longtemps que son bloc respectif. Ensuite, nous agrégons nos données d'exemple, en appliquant la fonction min sur toutes les entrées avec le même identifiant. Le data.frame qui en résulte a alternativement des entrées positives et négatives. Les entrées négatives sont les minima souhaités des blocs négatifs.

Le résultat (dans mon cas):

sample.data 
    [1] 0.781352094 0.005568218 1.230054543 -0.825140291 0.861346012 
    [6] -0.829708513 -0.452102503 -0.559146728 -1.017299175 -0.979450702 
    [11] -1.492603312 -0.466351610 1.189238669 -0.674493774 -0.120572288 
    [16] -0.336176940 0.348560999 0.420171989 1.459037512 0.056945430 
    aggregate(sample.data,by = list(unlist(mapply(rep,b,c))),min) 

    Group.1   x 
    1  1 0.005568218 
    2  2 -0.825140291 
    3  3 0.861346012 
    4  4 -1.492603312 
    5  5 1.189238669 
    6  6 -0.674493774 
    7  7 0.056945430 

Nous pouvons imprimer uniquement les minima comme celui-ci

 agg.df <- aggregate(sample.data,by = list(unlist(mapply(rep,b,c))),min) 
    agg.df[,2][rle(sample.data<0)$value] 

    [1] -0.8251403 -1.4926033 -0.6744938 
Questions connexes