[R] Better way to find distances between points in a set?
Charles C. Berry
cberry at tajo.ucsd.edu
Wed Dec 10 20:49:26 CET 2008
On Wed, 10 Dec 2008, cgw at witthoft.com wrote:
>
> Hah!
> I DID do my homework first. From now on I guess I'll have to post the
> complete list of trails I followed before deciding
> I was lost. That appears to be the only way to stave off the Harpies.
> So, before I posted, and before I even wrote my toy script, I found and read
> thru the help file for dist(). If in fact dist() does what I want, I
> couldn't see that from either the description or the example. Or from an
> example I tried myself.
> Remember: my Euclidean distance requires first finding the difference
> between the orthogonal components of the two points, i.e.
> (x1-x2) and (y1-y2) and then calculating the Pythagorean of those values.
> Just getting distances between the actual elements of my matrix (x and y
> components) isn't the same. And, yes, I tried 'euclidean' .
> So I would be greatful indeed if someone could confirm that, for a matrix as
> I described, where each row contains the coordinates of a single point, that
> dist() can be convinced to return the geometric euclidean distances.
> Or that it can't.
Carl,
Since you did your homework, you saw this:
From the dist man page:
dist(x, method = "euclidean", diag = FALSE, upper = FALSE, p = 2)
[...]
euclidean:
Usual square distance between the two vectors (2 norm).
---
If you did not appreciate that these 'two vectors' are two rows of
your matrix, this would have shown you that they are:
all.equal( as.vector(alldist), as.vector(alldist3) )
(the 'as.vector' calls strip off attributes like dimnames, so the focus is
solely on the distances )
Chuck
> Carl
> PS I also found which and which.max all by myself! ^_^
> Dec 9, 2008 11:52:46 PM, cberry at tajo.ucsd.edu wrote:
> ===========================================
> The 'better way' to do almost anything starts with a reading of the
> _posting guide_, which reminds you to
> Do your homework before posting [Reasons whyfor deleted]]
> Â Â * Do help.search("keyword") and apropos("keyword") with different
> keywords (type this at the R prompt).
> [other homework items deleted]
> So, to start with you would have tried:
> help.search('distance')
> HA! This leads to
> dist {stats} Distance Matrix Computation
> Well, doesn't that sound promising??
> > alldist3 <- as.matrix( dist( cv ) )
> > which( alldist3 == max( alldist3 ), arr.ind=TRUE )
> Oh yes, if you are too lazy to look up the posting guide URL, the function
> help.request() will open it for you when you admit that you haven't yet
> read it (or lead you thru the further steps to prepare a question to this
> list if you say that you have read it).
> HTH,
> Chuck
> On Tue, 9 Dec 2008, Carl Witthoft wrote:
> > I was playing around a bit to see how I could find the two points in a set
> of
> > points (or ordered pairs) Â furthest from each other.
> >
> > Here's what I did:
> > 1) created a Nrow by 2col matrix, so each row contains an x,y coordinate
> > pair.
> >
> > 2) fed the matrix to a nested mapply (cv is my matrix):
> >
> > mapply(function(k,l) mapply(function(x,y,a,b)
> > + sqrt((x-a)^2+(y-b)^2),cv[,1],cv[,2],k,l),cv[,1],cv[,2])->alldist
> >
> > Then I just did which.max(alldist) and found the original two points by
> > figuring out what row, col the results of which.max referred to.
> >
> > So, what's a better, or cleaner way to do all this? Â That is, is there a
> > function in some package that will do anything like my nested mapply
> thing,
> > and is there a better tool than which.max for locating a position in a
> > matrix?
> >
> > thanks
> > Carl
> >
> > ______________________________________________
> > 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.
> >
> >
> Charles C. Berry               (858) 534-2098
> Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Dept of
> Family/Preventive Medicine
> E mailto:cberry at tajo.ucsd.edu       UC San Diego
> http://famprevmed.ucsd.edu/faculty/cberry/ Â La Jolla, San Diego 92093-0901
> ______________________________________________
> 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.
>
Charles C. Berry (858) 534-2098
Dept of Family/Preventive Medicine
E mailto:cberry at tajo.ucsd.edu UC San Diego
http://famprevmed.ucsd.edu/faculty/cberry/ La Jolla, San Diego 92093-0901
More information about the R-help
mailing list