Milton Cezar Ribeiro
2008-Feb-09 04:01 UTC
[R] shortest distance between two point pattern
Um texto embutido e sem conjunto de caracteres especificado associado... Nome: n?o dispon?vel Url: https://stat.ethz.ch/pipermail/r-help/attachments/20080208/bf7b4696/attachment.pl
Try using dist: ix <- 1:nrow(df.1) m <- as.matrix(dist(rbind(df.1, df.2)))[ix, -ix] which(min(m) == m, arr = TRUE) On Feb 8, 2008 11:01 PM, Milton Cezar Ribeiro <milton_ruser at yahoo.com.br> wrote:> Hi R-experts. > > I am working in a R-code where I have two datasets with x and y coordinates on each dataset. > I intent to identify the shortest distance between this two datasets. I wrote a short code to do that. > But when I join the datasets to compute the distances, the merge function run so slowly. > I need only to identify the index of rows from each dataset related to the shortest distance. > > x0<-rnorm(n=500,mean=1,sd=runif(1)) > y0<-rnorm(n=500,mean=3,sd=runif(1)) > x1<-rnorm(n=700,mean=8,sd=runif(1)) > y1<-rnorm(n=700,mean=5,sd=runif(1)) > df.0<-cbind(x0,y0) > df.1<-cbind(x1,y1) > plot(df.0,xlim=range(c(x0,x1)),ylim=range(c(y0,y1))) > points(df.1,col=2) > rm(x0,x1,y0,y1) > > #merge two data.frames of points > #### IT SPEND many time > df.merge<-merge(df.0,df.1,all=T) > #compute distances between each pair of points > attach(df.merge) > df.merge$distance<-((x0-x1)^2+(y0-y1)^2)^0.5 > detach(df.merge) > #identify the minimum distance > df.merge.distance.min<-min(df.merge$distance) > #select the pair of points (x0,y0,x1,y1) with shortest distance > df.merge.distance.min.subset<-subset(df.merge,df.merge$distance<=df.merge.distance.min) > #trace a arrow between the points with shortest distance > arrows(df.merge.distance.min.subset[1,1],df.merge.distance.min.subset[1,2],df.merge.distance.min.subset[1,3],df.merge.distance.min.subset[1,4],code=0,col=3,lwd=2,lty=1) > > Any help are welcome > > Miltinho > Brazil. > > > > para armazenamento! > > [[alternative HTML version deleted]] > > ______________________________________________ > 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. >
Dear Miltinho, there is also the function "matchpt" in the Biobase package (in Bioconductor) that seems to do what you want (in n dimensions). It's written in C, and the implementation is simple and of complexity n*m. (For larger problems, there are more efficient nearest neighbor search algorithms, but I am not aware whether or where in R.). This one works well for medium sized problem as in your example. Best wishes Wolfgang ------------------------------------------------------------------ Wolfgang Huber EBI/EMBL Cambridge UK http://www.ebi.ac.uk/huber Milton Cezar Ribeiro scripsit:> Hi R-experts. > > I am working in a R-code where I have two datasets with x and y coordinates on each dataset. > I intent to identify the shortest distance between this two datasets. I wrote a short code to do that. > But when I join the datasets to compute the distances, the merge function run so slowly. > I need only to identify the index of rows from each dataset related to the shortest distance. > > x0<-rnorm(n=500,mean=1,sd=runif(1)) > y0<-rnorm(n=500,mean=3,sd=runif(1)) > x1<-rnorm(n=700,mean=8,sd=runif(1)) > y1<-rnorm(n=700,mean=5,sd=runif(1)) > df.0<-cbind(x0,y0) > df.1<-cbind(x1,y1) > plot(df.0,xlim=range(c(x0,x1)),ylim=range(c(y0,y1))) > points(df.1,col=2) > rm(x0,x1,y0,y1) > > #merge two data.frames of points > #### IT SPEND many time > df.merge<-merge(df.0,df.1,all=T) > #compute distances between each pair of points > attach(df.merge) > df.merge$distance<-((x0-x1)^2+(y0-y1)^2)^0.5 > detach(df.merge) > #identify the minimum distance > df.merge.distance.min<-min(df.merge$distance) > #select the pair of points (x0,y0,x1,y1) with shortest distance > df.merge.distance.min.subset<-subset(df.merge,df.merge$distance<=df.merge.distance.min) > #trace a arrow between the points with shortest distance > arrows(df.merge.distance.min.subset[1,1],df.merge.distance.min.subset[1,2],df.merge.distance.min.subset[1,3],df.merge.distance.min.subset[1,4],code=0,col=3,lwd=2,lty=1) > > Any help are welcome > > Miltinho > Brazil. > >