[R] Selecting contiguous, irregularly-shaped sets of values from arrays

Bryan McCloskey bmccloskey at usgs.gov
Mon Feb 6 23:08:59 CET 2012


Chris,

That worked exceptionally well. Here's the pseudo-code for what I ended up using:

library(spatstat)
depth_bin<-depth<-stage-elevation #depth at grid cells = stage matrix - elevation matrix; initialize binary matrix
depth_bin[,]<-depth>5 #binary matrix of cells >5cm deep
depth_con_im<-connected(as.im(depth_bin),background=0) #8-connected regions of pixel image
depth_con<-depth_con_im$v #v element is data matrix
class(depth_con)<-"matrix"
for (i in 1:length(coords$points)) { #points of interest
	x_co<-which.min(abs(x-coords$EASTING[i]))
	y_co<-which.min(abs(y-coords$NORTHING[i]))
	pond[i]<-depth_con[x_co,y_co] #pond of cell of interest
	area[i]<-length(which(depth_con==pond[i]))*400*400 #area of the pond (400m grid)
	depth[i]<-depth[x_co,y_co] #depth at cell of interest
}

Thanks for the tip!
-bryan

------
Bryan McCloskey, Ph.D.
IT Specialist (Data Management/Internet)
U.S. Geological Survey
St. Petersburg Coastal & Marine Science Center
600 Fourth St. South
St. Petersburg, FL 33701

South Florida Information Access: http://sofia.usgs.gov
Everglades Depth Estimation Network: http://sofia.usgs.gov/eden
Phone: 727.803.8747x3017 * Fax: 727.803.2032
------

On Feb 1, 2012, at 9:34 AM, Chris Campbell wrote:

> Dear Bryan,
>  
> You could try using spatial techniques to choose the contiguous areas of your matrices.
>  
> > require(spatstat)
> > set.seed(1520)
> > x <- matrix(rnorm(25), nrow=5, ncol=5,
> +          dimnames=list(c("A","B","C","D","E"), c("v","w","x","y","z")))
> > x
>            v            w          x         y           z
> A  0.3089046 -0.003350135 -0.4506777 0.7971787 -1.95078919
> B -1.5895009  0.336233539 -0.3237293 0.7676754 -0.76756928
> C -1.0324022 -1.119037223 -1.1525350 0.6057773 -0.28930702
> D -0.8440912 -0.499994418  0.7664473 0.6367184 -0.09801227
> E  0.6261038  0.391232210  0.4967601 1.0753439 -0.50998559
> > z <- y <- x
> >
> > y[, ] <- x < 0.6
> > y
>   v w x y z
> A 1 1 1 0 1
> B 1 1 1 0 1
> C 1 1 1 0 1
> D 1 1 0 0 1
> E 0 1 1 0 1
> > yi <- as.im(y)
> > ycOut <- connected(yi, background = 0)
> > yc <- ycOut$v
> > yc
>      [,1] [,2] [,3] [,4] [,5]
> [1,] 1    1    1    <NA> 2  
> [2,] 1    1    1    <NA> 2  
> [3,] 1    1    1    <NA> 2  
> [4,] 1    1    <NA> <NA> 2  
> [5,] <NA> 1    1    <NA> 2  
> Levels: 1 2
> >
> > z[yc != 1 | is.na(yc)] <- NA
> > z
>            v            w          x  y  z
> A  0.3089046 -0.003350135 -0.4506777 NA NA
> B -1.5895009  0.336233539 -0.3237293 NA NA
> C -1.0324022 -1.119037223 -1.1525350 NA NA
> D -0.8440912 -0.499994418         NA NA NA
> E         NA  0.391232210  0.4967601 NA NA
>  
> Hope this helps.
>  
> Best wishes,
>  
> Chris Campbell
> MANGO SOLUTIONS
> Data Analysis that Delivers
> +44 1249 767700
>  
>  
> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf Of Bryan McCloskey
> Sent: 31 January 2012 19:58
> To: r-help at r-project.org
> Subject: [R] Selecting contiguous, irregularly-shaped sets of values from arrays
>  
> All,
>  
> I am attempting to select all of the contiguous elements of a matrix that meet some criterion. I.e., values that would be contained within an irregular area defined by a "contour" applied around point of interest. So, if I have a matrix x as follows:
>  
> > x <- matrix(rnorm(25), nrow=5, ncol=5,
>          dimnames=list(c("A","B","C","D","E"), c("v","w","x","y","z"))
> > x
>            v          w          x         y          z
> A  0.5184795  1.9641285  0.8632044 1.5010397  0.8468490 B -1.2402866  0.5211307 -0.1474351 1.3264893  0.1087390 C  0.5910275 -1.1708906  0.9440755 1.0970971 -0.2784806 D  0.6377495  1.1594035 -0.4217621 1.4021680 -0.6487677 E -1.4590833  0.2065765  0.1623669 1.3598283  0.3742821
> >
>  
> how can I select all values in the "pond" of contiguous matrix entries that have values, say <0.6, if my entry of interest is x["A","v"]. In that case, I would like to select the following starred entries:
>  
>            v          w          x         y          z
> A  0.5184795*  1.9641285  0.8632044 1.5010397  0.8468490 B -1.2402866*  0.5211307* -0.1474351* 1.3264893  0.1087390 C  0.5910275* -1.1708906*  0.9440755 1.0970971 -0.2784806 D  0.6377495  1.1594035 -0.4217621* 1.4021680 -0.6487677 E -1.4590833  0.2065765*  0.1623669* 1.3598283  0.3742821
>  
> But I would _not_ like to select any of the values in x[,"z"], because, even though they may be <0.6, they are not contiguous with the pond that x["A","v"] is in.
>  
> Is there an easy way to do this for many points of interest in a large matrix?
>  
> Thanks,
> -bryan
>  
> ------
> Bryan McCloskey, Ph.D.
> U.S. Geological Survey
> St. Petersburg Coastal & Marine Science Center St. Petersburg
> ------
>  
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>  
> LEGAL NOTICE
> This message is intended for the use of the named recipient(s) only and may contain confidential and / or privileged information. If you are not the intended recipient, please contact the sender and delete this message. Any unauthorised use of the information contained in this message is prohibited.
> 
> Mango Business Solutions Limited is registered in England under No. 4560258 with its registered office at Suite 3, Middlesex House, Rutherford Close, Stevenage, Herts, SG1 2EF, UK.
> 
> PLEASE CONSIDER THE ENVIRONMENT BEFORE PRINTING THIS EMAIL
> 
>  



More information about the R-help mailing list