2013-12-09 5 views
2

R에서는 최대/최소 명령을 사용하여 지리 참조 래스터 스택에서 각 셀의 최대/최소 값을 쉽게 계산할 수 있습니다.래스터 스택에서 두 번째로 높은 값 찾기 R

set.seed(42) 
require(raster) 
r1 <- raster(nrows=10, ncols=10) 
r2=r3=r4=r1 
r1[]= runif(ncell(r1)) 
r2[]= runif(ncell(r1))+0.2 
r3[]= runif(ncell(r1))-0.2 
r4[]= runif(ncell(r1)) 
rs=stack(r1,r2,r3,r4) 
plot(rs) 
max(rs) 
min(rs) 

그러나 스택에서 두 번째로 높은 값을 찾는 방법을 찾으려고했습니다. 필자의 경우 스택상의 각 래스터는 공간을 가로 지르는 특정 모델의 성능을 나타냅니다. 첫 번째와 두 번째로 가장 좋은 값을 비교하여 스택을 행렬로 변환 한 다음 래스터로 다시 변환하지 않고도 주자에서 가장 좋은 모델이 얼마나 더 좋은지를 판단하고 싶습니다. 어떤 아이디어 또는 제안 ??

+0

'맥스 (R을 [RS <맥스 (rs)])'는 단조로운 방법입니다. –

+0

r은 [rs [rs

+0

예, 죄송합니다. - 스택의 속성에 대해 강요해야합니다. –

답변

5

아래 코드를 정확한 상황에 맞게 조정하여 calc()을 사용하는 것이 좋습니다. 광고 된대로 작동한다는 것을 보여주기 위해 4 층 RasterStack 개체의 각 셀에서 가장 높은 값, 두 번째로 높은 값, 세 번째 값, 네 번째 값을 취하여 각 레이어를 개별적으로 플롯했습니다.

zz <- range(cellStats(rs, range)) 

par(mfcol=c(2,2)) 
plot(calc(rs, fun=function(X,na.rm) X[order(X,decreasing=T)[1]]), main="1st",zlim=zz) 
plot(calc(rs, fun=function(X,na.rm) X[order(X,decreasing=T)[2]]), main="2nd",zlim=zz) 
plot(calc(rs, fun=function(X,na.rm) X[order(X,decreasing=T)[3]]), main="3rd",zlim=zz) 
plot(calc(rs, fun=function(X,na.rm) X[order(X,decreasing=T)[4]]), main="4th",zlim=zz) 

또는보다 컴팩트하고 효율적으로 단지 재정렬 값을 보유하는 새로운 래스터 스택을 구축하고 그 층 플롯 :

zz <- range(cellStats(rs, range)) 
rs_ord <- calc(rs, fun=function(X,na.rm) X[order(X,decreasing=T)]) 

par(mfcol=c(2,2)) 
plot(rs_ord[[1]], main="1st", zlim=zz) 
plot(rs_ord[[2]], main="2nd", zlim=zz) 
plot(rs_ord[[3]], main="3rd", zlim=zz) 
plot(rs_ord[[4]], main="4th", zlim=zz) 

enter image description here

+0

이것은 아름답습니다. 래스터 : calc 함수를 사용해 보았지만 작동시키지 못했습니다. 이것은 내가 필요로하는 것과 정확히 똑같은 상황에서 유용합니다. –

+0

좋습니다. 나는 그것이 아름답다는 데 동의하고 ** 래스터 **를 사용할 때마다 그런 식으로 느끼게됩니다. 'na.rm'을'fun = '를 통해 여러분이 제공하는 함수의 형식적 인수로 포함 시키십시오. 함수의 몸체 어디에서나 사용되지는 않을지라도 말입니다. 'calc()'는 그 이름의 인수를 검사하고 필요로하는 코드를 가지고있다. –

+1

저는 Raster 패키지의 포괄성에 정말 경외감을 느낍니다. 나는 그것을 발견했기 때문에 동료들에 의한 사용에 대한 강한 지지자였으며, 종종 Arcgis 래스터 계산기와 다른 열등하고 값 비싼 클로즈드 소스 대안에 대한 오랜 좌절스러운 과거 경험에 대해 생각해 보았습니다. 다시 한번 감사드립니다. –

관련 문제