2013-12-09 2 views
2

В R Я могу легко вычислить максимальное/минимальное значение каждой ячейки в стеке с привязкой к привязке с использованием команд max/min.Найти второе наивысшее значение в стеке растра в 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

'макс (Rs [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

Я действительно в восторге от полноты растрового пакета. Поскольку я обнаружил это, я был сильным сторонником его использования коллегами и часто сжимал мысли о моем долгом и разочаровывающем прошлом опыте с растровым калькулятором Arcgis и другими низшими, дорогостоящими и закрытыми альтернативами источника ... Еще раз спасибо. –

Смежные вопросы