2014-04-29 8 views
0

전역에 걸쳐 NA 값이 광범위하지만 불규칙한 위치 (즉, 데이터가있는 셀이 연속적이지 않고 전체에 NA 값이 분산되어 있음)의 R에서 1km 해상도 래스터가 있습니다. 원형 각도를 평균화하기 위해 사용자 정의 함수 (아래에 포함)를 사용하여 5km 분해능 (factor = 5)에서이 래스터를 집계하려고합니다 ({raster} 패키지에서 aggregate() 명령 사용). 현재, 래스터에 연속 5x5 셀 영역이 없으면 결과 값을 제공하기 위해 aggregate() (또는 문제가 있다면 내 함수)를 얻는 방법을 파악할 수 없습니다. 즉 집계 윈도우가 5x5 셀 영역에 데이터 값 (20 개의 NA 셀)이있는 5 개의 셀만있는 경우이 셀은 평균값을 반환하기를 원합니다. 행운을 빌어 함수와 집계() 명령의 na.action 옵션을 수정 해 보았습니다. 나는 경험이 많은 슈퍼 유저가 아니기 때문에 문제가있을 수있다.NA 값이있는 R의 집계 래스터

없는 작업, 예를 들어 미안하지만 여기 내 원형 평균 함수의

R.

내에서 유사한 예를 래스터 레이어를 생성하는 방법을 잘 :

library(circular) 
avg.ang <- function(x,...){ 
    mean.circular(circular(x, units="degrees", rotation="clock", zero=pi/2, modulo="2pi")) 
} 

그리고 여기 내가 사용 집계 코드입니다 ('각도'에 걸쳐 흩어져 NA 값을 갖는 래스터 1km 임) :

library(raster) 
angle5k <- aggregate(angle, fact=5, fun=avg.ang, expand=T) 

하지만 이것은 단지 응집 wher 위치에서의 값으로 래스터 층을 반환 e 5x5 창의 모든 셀에는 값이 들어 있습니다.

+1

'mean.circular()'호출에서'na.rm = TRUE'를 설정해야합니다. –

+1

그래, 모든 트릭을했는데, 더 작은 if/else 수정으로 모든 셀이 NA 일 때 발생하는 오류를 처리했습니다. 아래 수정 된 기능을 게시합니다. 감사! –

답변

1

감사합니다. Josh에게 도움이됩니다. 여기에 내가 무엇을 찾고 있어요 생산이 수정 된 기능입니다 :

na.rm=TRUE
avg.ang <- function(x, ...){ 
    if (sum(is.na(x))==length(x)) { 
     NA 
    } else { 
     round(mean.circular(circular(x, units="degrees", rotation="clock", 
            zero=pi/2, modulo="2pi"), na.rm=TRUE)) 
    } 
} 

키입니다. if/else 문은 모든 셀이 NA 인 발생을 처리합니다 (그렇지 않으면 오류가 발생 함). 누군가가 if/else를 다루는보다 우아한 방법을 가지고 있다면, 나는 모든 귀입니다.

+1

좋아요. 두 번째 줄에서는'all (is.na (x)) '을 사용하여 조건을 테스트 할 수 있습니다. –

+0

좋은 결과입니다. 어떤 종류의 변수가이 함수로 조작 될 것인가? –

+0

@Paulo 필자는 래스터의 단지 1km 해상도보다 넓은 영역에서 평균화해야하는 나침반 베어링 (따라서 0, 회전 및 모듈로 옵션)에 대한 원형 각도 측정 (0-360 °, 따라서 단위 옵션)을가집니다. 이 신청서는 기후 변화 예측을위한 것입니다. –

관련 문제