래스터 벽돌, R에서 시간이 지남에 따라 우울증 (음수의 그룹) 계산

StackOverflow https://stackoverflow.com//questions/9616471

  •  09-12-2019
  •  | 
  •  

문제

기후 데이터 세트에서 우울한 그룹 수 (음수 값)를 계산하려고 노력하고 있으며 그것에 대해가는 방법에 대해 적어도 효과적으로 생각할 수 있습니다. 시나리오를 설명하겠습니다. 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$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 (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
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top