[GRASS-dev] Determine raster rank order per raster cell

Paulo van Breugel p.vanbreugel at gmail.com
Thu Jan 23 02:28:48 PST 2014


On Thu 23 Jan 2014 11:15:17 AM CET, Moritz Lennert wrote:
> On 22/01/14 23:20, Paulo van Breugel wrote:
>> Does anybody know a smart way to calculate for X rasters per raster cell
>> the rank order of those rasters? For example, if I have three rasters
>> X1, X2 and X3:
>>
>> X1   X2   X3
>> 1      3     2
>> 2      5     8
>> 5     1      3
>> NA  8      2
>>
>> would give three new raster layers with the values:
>>
>> Y1   Y2   Y3
>> 1      3     2
>> 1      2     3
>> 3      1     2
>> NA   2    1
>>
>> I am now reading the rasters in R and using a combination of apply() and
>> rank() function to create new raster layers:
>>
>> in <- c("X1",  "X2", "X3")
>> lyrs <- readRAST6(in)
>> tmp <- apply(lyrs at data, 1, function(x){
>>      rank(x, na.last="keep", ties.method="average")
>> })
>> lyrs at data <- t(tmp)
>>
>> I am sure there are better ways in R, but especially when dealing with
>> very large raster layers, I was hoping there is a way to do this
>> directly in GRASS GIS. Or otherwise, would it be difficult to create a
>> function for this?
>
> I don't know how efficient this would be, but how about using
> r.mapcalc with something like this for each map:
>
> Y1 = if(X1>X2, if(X1>X3, 1, 2), if(X1>X3, 2, 3))
>
> Moritz


Thanks Moritz,

I had thought about that, works good for few maps, but it gets a bit 
unwieldy with e.g., 40 maps. I'll try though if I can split the if 
function somehow.

Cheers,

Paulo


More information about the grass-dev mailing list