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

现在在这里我需要做两个任务

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 -102.314928 -113.271826 -115.372023 -79.530055) 等。生成的图层像素值应该是这些组的计数,在这种情况下为 5。同样需要对时间维度上的所有像素进行处理。

2)对于我想选择最小值的每个组,结果像素将具有这些最小值的总和。如果一个组有一个值,请保持相同。

我坚持从这个过程开始。我假设我需要将砖块转换为数据框并执行此操作。

任何人都可以帮助我指导如何去做吗?

非常感谢任何帮助。

对不起,如果解释令人困惑。

问候 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)

(对不起列表(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 回答