2014-04-09 3 views
2

내 연구를 위해 많은 얼음이있는 지역의 위성 데이터 래스터 스택을 만듭니다.이 때문에 많은 이미지가 완전히 NA로 채워집니다. 이 내가 스택에서 자동으로 제거하고 싶습니다. ,r의 래스터 스택에서 빈 래스터를 자동으로 제거하는 방법은 무엇입니까?

r <- raster(nrow=10, ncol=10) 
s1 <- s2<- list() 
for (i in 1:12) { 
    s1[i] <- setValues(r, rnorm(ncell(r), i, 3)) 
    s2[i] <- setValues(r, rnorm(ncell(r), i, 3)) 
} 
s1 <- stack(s1) 
s3 <- subset(s1,1) 
s3[] <- NA 
s2 <- stack(s2) 

# regression of values in one brick (or stack) with another 
s <- stack(s1,s3, s2) 

중간 이미지, 이미지 (13),이다 완전히 NA가, 지금은이 부분 집합 기능을 사용하여 삭제할 수 있습니다, 나는 rasterstack 있다고 가정,하지만 어떻게 내가 r은 자동으로이 층을 제거하는 얻을 수 그래서 나는 같은 것을 얻는다.

s_no_na <- stack(s1,s2) 

답변

1

"자동"이란 무엇을 의미합니까? 그것을 시험해야합니다.

각 래스터를 !any(is.na(values(s))) 또는 all(is.na(values(s)))과 같이 테스트 해보십시오. 여기서 s은 래스터입니다. 최종 스택을 빌드하는 함수에 루프를 넣으십시오.

sf = do.call(stack, Filter(function(e){!all(is.na(values(e)))},list(s1,s3,s2))) 
+0

이 작품은 나를 위해. 고마워. – MGIGijs

+0

'do.call'은 여기 이상합니다. 나는'stack (filtered list)'을 할 것이다. – RobertH

-1

나는이 방법을 선호 조금 짧고이다 : 당신이 한 줄을 원하는 경우에

,이 필터링 된 목록에 stack을 적용 후 do.call을 목록에서 선택할 수 Filter를 사용하고, 달콤한 :

result <- rasters[!sapply(rasters, is.null)] 
+0

내 대답을 왜 다운 그레이드했는지 설명하기 위해주의해야 하는가? 그것은 아주 잘 작동합니다. –

1

다른 접근법이 있습니다. 모든 값이 NA 인 경우 최소값은 NA입니다. 그러면 다음을 할 수 있습니다.

i <- !is.na(minValue(s)) 
s_no_na <- s[[i]] 

minValue를 알면 매우 빠를 수 있습니다 (그렇지 않으면 계산해야 함).