[R] Better way to find distances between points in a set?

Carl Witthoft carl at witthoft.com
Wed Dec 10 23:11:36 CET 2008


Ok... then..
I didn't mean to start a flame war, so first off I apologize for firing 
off my second comment.

I think a fair compromise is:  I should have at least noted that I got 
as far as finding dist()  (and which.max()), thus showing "some" effort 
on my part before posting my query.

Anyway, I'm happy now because not only did I successfully navigate 
mapply, I got some great info on dist and which.* from this mailing list.

Carl

Stavros Macrakis wrote:
> On Tue, Dec 9, 2008 at 11:52 PM, Charles C. Berry <cberry at tajo.ucsd.edu>wrote:
> 
[redacted]
> 
> 
> Charles, I am distressed by the nasty tone of your note.  Though I certainly
> agree that poor queries on this list are an annoyance, and that the posting
> guide gives useful advice on what to do before posting, I don't think that
> poor queries are a reason to presume bad faith for any but the most flagrant
> correspondents ("here is my problem set, solve it for me").  And though I
> have not been on this list very long, I have been answering questions on
> other lists like this for a long time.
> 
> What's more, it seems to me that Witthoft has a legitimate problem.  I tried
> to solve it myself, and here is what I come up with:
> 
> test <- matrix(rnorm(20),ncol=2)
> 
> which.max(dist(x),arr.ind=TRUE)
>      => Error, though which supports arr.ind, which.max doesn't
>         Yes, that is documented, but it violates reasonable expectations.
> 
> which(dist(x)==max(dist(x)),arr.ind=TRUE)
>      => 21  oops, that is a vector index; what about arr.ind?
>         Apparently the dist class (return class of dist fnc.)
>         doesn't act as an array here (and which/arr.ind is
>         happy to treat a vector as an array without warning).
>         Is this a problem in dist, or a problem in which?
>         So how do I map back from 21 to 3,7?  Nothing obvious.
>         ? `[`, ? array, and ? dist don't seem to help.
> 
> So let's convert to a matrix explicitly:
> 
> which(as.matrix(dist(x)==max(dist(x))),arr.ind=TRUE)
>      =>      row col
>          [1,] 21   1
>         Hmm, that's not right; apparently the == flattened the
>         dist class into its base vector, which which/arr.ind
>         helpfully (?) treated as a matrix.
> 
> which(as.matrix(dist(x))==max(dist(x)),arr.ind=TRUE)
>     =>        row col
>           7     7   3
>           3     3   7
>         Finally getting useful results; but converting to the array
>         added in the upper triangular part... oh, well, we need to
>         choose *which* maximum anyway.
> 
> So, as Witthoft said: what's a better, or cleaner way to do all this?  And
> why aren't R's operators more regular in their behavior?  Why doesn't
> arr.ind work for which.max?  Why doesn't dist(x)==1 return an object of the
> same shape as the original dist (as matrix(...)==1 would have), but instead
> flatten it?  Where does one find the function that maps from a list of array
> indices to the corresponding vector index and vice versa?
> 
>              -s
>



More information about the R-help mailing list