래스터 벽돌, R에서 시간이 지남에 따라 우울증 (음수의 그룹) 계산
문제
기후 데이터 세트에서 우울한 그룹 수 (음수 값)를 계산하려고 노력하고 있으며 그것에 대해가는 방법에 대해 적어도 효과적으로 생각할 수 있습니다. 시나리오를 설명하겠습니다. 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) 강우량이 낮아지는 횟수 - 부정적인 값을 가진 평균 이하로갔습니다. 그리고 0은 계산의 용이성을 위해 긍정적 인 RF 값 (RECLASS를 사용하여 0으로 변환)입니다. 위의 예에서는 음수의 그룹을 선택하고 카운트 그룹을 선택하고 싶습니다. 즉, (-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
해결책
조건을 만족하는 벡터의 인접한 요소를 찾는 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)
.
(목록에 대해 죄송합니다 (Unlist (Unlist ()), 분명히 R) 목록을 평평하게하는 방법을 모르겠습니다.
mapply
명령은 1에서 총 블록 수까지 번호가 매겨진 각 블록에 대한 식별자 목록을 만듭니다. rep 명령은 각 식별자가 각각의 블록만큼 반복되도록합니다. 그런 다음 샘플 데이터를 집계하여 동일한 식별자가있는 모든 항목에 최소 기능을 적용합니다. 결과 데이터. 프레임은 양수 및 음수 항목을 번갈아 가고 있습니다. 부정적인 항목은 음의 블록의 원하는 최소값입니다.
결과 (내 경우) :
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
.