1

私は気候データセットからうつ病のグループ(負の値)の数を数えようとしていますが、それをどうやって行うかについてはほとんど考えていません。シナリオを説明しましょう。468レイヤーのラスターブリックがあり、各レイヤーには7458セルがあります。

> 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 ... 

たとえば、5000番目のピクセルを見てみましょう

> cntneg[5000]

これにより、時間の経過とともにそのピクセルの468個の値が得られます。

[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

ここで、2つのタスクを実行する必要があります

1)降雨量が平均を下回った回数を数えます-負の値を持つもの。また、計算を容易にするために、ゼロは正のRF値(再分類を使用してゼロに変換)を使用しています。上記の例では、負の数のグループを選択してカウントします。すなわち、(-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 -113.271826 -115.372023 -79.530055)など。結果のレイヤーピクセル値は、これらのグループのカウントである必要があります。この場合は5です。同様に、時間ディメンションに沿ってすべてのピクセルに対して行う必要があります。

2)グループごとに最小値を選択したいので、結果のピクセルにはそれらの最小値の合計が含まれます。グループに1つの値がある場合は、同じままにします。

私はこのプロセスから始めることに固執しています。ブリックをデータフレームに変換してこれを行う必要があると想定しています。

誰かがそれをどうやって進めるかについてのリードを与えるのを手伝ってくれる?

本当に助けてくれてありがとう。

説明がわかりにくい場合は申し訳ありません。

よろしくSP

4

1 に答える 1

0

rle条件を満たすベクトルの連続した要素を見つけるという便利な関数があります。関数呼び出しは、ベクトル内のブロックの長さと値をそれぞれ含むとres<-rle(vector<0)を返します。res$lengthsres$values

だから私たちはこのようにすることができます

    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)

(list(unlist()) で申し訳ありません。どうやら R でリストを平坦化する方法がわかりません)

このmapplyコマンドは、1 からブロックの総数までの番号が付けられた、各ブロックの識別子のリストを作成します。rep コマンドは、各識別子がそれぞれのブロックである限り繰り返されることを保証します。次に、同じ識別子を持つすべてのエントリに min 関数を適用して、サンプル データを集計します。結果の data.frame には、正と負のエントリが交互に含まれています。負のエントリは、負のブロックの必要な最小値です。

結果(私の場合):

    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

このように最小値のみを出力できます

     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
于 2012-03-08T16:54:10.403 に答える