[GRASS-stats] Reclassyify in R

Roger Bivand Roger.Bivand at nhh.no
Thu Nov 29 04:42:28 EST 2007


On Thu, 29 Nov 2007, Jaros?aw Jasiewicz wrote:

> Dear all.
>
>
> Working on my problem I stopped on another issue.
> I try to reclassify SpatialGridDataFrame acording to vector file:
> let say:
> - slope imported from GRASS (sp_layer, numeric vector from SpGridDataFrame 
> slope$slope)
> -density obiect made in R (iloraz_obiect, with density$x with ald values and 
> density$y with new vlues)
>
> And I have very primitive (step by step) solution:
>
> reclass<-function(sp_layer,dens_iloraz_object) {
>
> tmp_k<-0
> layer_length<-length(sp_layer) #number of values in reclasified vector, about 
> million
> dens_length<-length(dens_iloraz_object$x) #number of class of reclassify
>
> for (i in seq(1:layer_length)) {  #loop for million iteration
>    if (is.na(sp_layer[i])) tmp_k[i]<-NA else { #test if there is NA value
>       if (sp_layer[i]==dens_iloraz_object$x[dens_length]) #test if it is max 
> and last value of recllsifying vector
>            {tmp_k[i]<-dens_iloraz_object$y[dens_length] } else {
>               for (j in seq(1:(dens_length-1))) { #reclasify according rules 
> loop about 32 or 64 rules
>                if (!is.na(tmp_k[i])) break #if done! break!
>                   if (sp_layer[i]>=dens_iloraz_object$x[j] & 
> sp_layer[i]<dens_iloraz_object$x[j+1]) tmp_k[i]<-dens_iloraz_object$y[j]
>                }
>        }
>   }
> }
> return (tmp_k)
>
> } #end funcion
>
> What is the problem If works?      it is komputer killer.
>
>
> I have solution which seems faster:
>
> reclass<-function(sp_layer,dens_iloraz_object) {
>
> tmp_k<-NA
> dens_length<-length(dens_iloraz_object$x)
>
>   if (sp_layer==dens_iloraz_object$x[dens_length]) 
> {tmp_k<-dens_iloraz_object$y[dens_length] } else {
>        for (j in seq(1:(dens_length-1))) {
>            if (!is.na(tmp_k)) break
>               if (sp_layer>=dens_iloraz_object$x[j] & 
> sp_layer<dens_iloraz_object$x[j+1]) tmp_k<-dens_iloraz_object$y[j]
>        }
>    }
>  return (tmp_k)
> }
> and next:
> k=ifelse(is.na(sp_layer),NA,reclass(sp_layer,iloraz_dens))
>
> but I cannot handle if (sp_layer==......) in function, which proceeds on 
> vector and use only first element
>
>
>
> I look for little faster solution

Try cut():

library(spgrass6)
slope <- readRAST6("slope at PERMANENT")
names(slope)
summary(slope)
library(classInt)
t1 <- classIntervals(slope$slope.PERMANENT, n=32, "pretty")
t2 <- print(t1)
slope$slcut <- cut(slope$slope.PERMANENT, breaks=t1$brks,
   labels=names(t2), include.lowest=TRUE)
table(slope$slcut)
t2

where you would construct breaks= and labels= from your x and y (here I 
just used classIntervals() as an easy way to creat some breaks). An 
alternative to cut() is findInterval(), and assign the labels 
subsequently.

Roger

> Maybe someone can help me?
>
> Jarek
> _______________________________________________
> grass-stats mailing list
> grass-stats at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/grass-stats
>

-- 
Roger Bivand
Economic Geography Section, Department of Economics, Norwegian School of
Economics and Business Administration, Helleveien 30, N-5045 Bergen,
Norway. voice: +47 55 95 93 55; fax +47 55 95 95 43
e-mail: Roger.Bivand at nhh.no


More information about the grass-stats mailing list