2012-03-08 3 views
1

기후 데이터 세트의 우울 (음수 값) 그룹 수를 계산하려고 시도하고 있습니다. . 시나리오를 설명해 드리겠습니다. 468 개의 레이어가있는 래스터 벽돌이 있고 각 레이어에는 7458 개의 셀이 있습니다. 래스터 벽돌에서 시간에 따른 우울증 (음수 그룹)을 계산하는 R

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

지금 예를 들어 시간이 지남에 나에게 그 픽셀의 468 개 값을 줄 것이다 5,000 번째 픽셀

> cntneg[5000] 

을 할 수 있습니다. 음의 값으로 그 -

[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

답변

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) 

처럼 할 수

mapply 명령 (목록 죄송합니다 (올라가지()), 분명히 나는 ​​R의 목록을 평평하게하는 방법을 모른다) 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 
같은 단지 최소값을 인쇄 할 수 있습니다