题
我正在尝试计算来自气候数据集的萧条(负值)的数量,并至少有关于如何实现的想法。 让我解释情景。 我有一个带有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)计数降雨量低于平均值的次数 - 具有负值的人。 Zeros具有正射频值(我使用replass转换为零)以便于计算。 在上面的例子中,我想选择一组负数和计数。即,(-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)对于我想要选择的每个组,并且产生的像素将具有这些最小值的总和。如果一个组有一个值,请保持相同。
我被困在这个过程中。我假设我需要将砖块转换为dataframe并执行此操作。
任何人都可以帮助我发出如何实现它的领导呢?
真的很欣赏任何帮助。
抱歉,如果解释令人困惑。
问候 sp
解决方案
有一个名为rle
的漂亮函数,用于找到满足条件的矢量的连续元素。函数调用生成res<-rle(vector<0)
给出了回归生成的res$lengths
和res$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)
.
(对不起列表(解释()),显然我不知道如何在r中展示一个列表)
mapply
命令为每个块创建一个标识符列表,编号为1到总块的总数。 REP命令可确保重复每个标识符,只要其相应的块重复。然后我们聚合我们的示例数据,在所有条目上应用min函数,具有相同的标识符。生成的数据.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
.