Dear all,thanyou so very much.
elisa

> From: dcarl...@tamu.edu
> To: dwinsem...@comcast.net
> CC: eliza_bo...@hotmail.com; r-help@r-project.org
> Subject: RE: [R] locating element in distance matrix
> Date: Fri, 11 Jan 2013 16:41:13 -0600
> 
> If you really have a matrix to begin with, yes. But if you generated it from
> dist() or its relations, you would have to convert it to a matrix (roughly
> doubling the memory needed). The various hierarchical cluster functions
> usually want a dist object.
> 
> > dm <- dist(x, diag=TRUE, upper=TRUE)
> > str(dm)
> Class 'dist'  atomic [1:45] 3.84 4.09 3.64 4.94 4.33 ...
>   ..- attr(*, "Size")= int 10
>   ..- attr(*, "Diag")= logi TRUE
>   ..- attr(*, "Upper")= logi TRUE
>   ..- attr(*, "method")= chr "euclidean"
>   ..- attr(*, "call")= language dist(x = x, diag = TRUE, upper = TRUE)
> 
> In dist(), diag=TRUE and upper=TRUE refer only to how the matrix is
> displayed. It is still stored as a single vector:
> 
> > round(dm, 3)
>        1     2     3     4     5     6     7     8     9    10
> 1  0.000 3.843 4.094 3.643 4.935 4.328 4.288 6.205 6.197 2.181
> 2  3.843 0.000 5.085 5.171 5.067 3.788 4.384 5.770 7.113 2.830
> 3  4.094 5.085 0.000 3.571 4.548 4.103 3.532 3.917 6.470 3.734
> 4  3.643 5.171 3.571 0.000 3.821 3.843 3.667 5.513 5.176 3.294
> 5  4.935 5.067 4.548 3.821 0.000 4.815 3.465 5.918 6.138 4.764
> 6  4.328 3.788 4.103 3.843 4.815 0.000 2.794 3.937 5.475 3.023
> 7  4.288 4.384 3.532 3.667 3.465 2.794 0.000 4.075 5.251 4.010
> 8  6.205 5.770 3.917 5.513 5.918 3.937 4.075 0.000 5.511 5.152
> 9  6.197 7.113 6.470 5.176 6.138 5.475 5.251 5.511 0.000 6.168
> 10 2.181 2.830 3.734 3.294 4.764 3.023 4.010 5.152 6.168 0.000
> > dm[1]
> [1] 3.843183
> > dm[2, 1]
> Error in dm[2, 1] : incorrect number of dimensions
> 
> ----------------------------------------------
> David L Carlson
> Associate Professor of Anthropology
> Texas A&M University
> College Station, TX 77843-4352
> 
> 
> 
> 
> > -----Original Message-----
> > From: David Winsemius [mailto:dwinsem...@comcast.net]
> > Sent: Friday, January 11, 2013 4:21 PM
> > To: dcarl...@tamu.edu
> > Cc: 'eliza botto'; r-help@r-project.org
> > Subject: Re: [R] locating element in distance matrix
> > 
> > 
> > On Jan 11, 2013, at 1:51 PM, David L Carlson wrote:
> > 
> > > If you have a dist object (created by dist()) or if you used
> > lower.tri(x) to
> > > extract the lower triangle of the matrix, which() will not work since
> > the
> > > matrix is now stored as a numeric vector with n(n-1)/2 elements where
> > n is
> > > the number of rows/columns. In that case you must compute the
> > original
> > > row/column values from the position along the vector:
> > >
> > >> dwhich <- function(d, indx) {
> > > +     i <- round((1+sqrt(1+8*length(d)))/2, 0)
> > > +     rowd <- unlist(sapply(2:i, function(x) x:i))
> > > +     cold <- rep(1:(i-1), (i-1):1)
> > > +     return(data.frame(indx=indx, row=rowd[indx], col=cold[indx]))
> > > + }
> > 
> > Wouldn't it be easier to leave the distance matrix structure intact and
> > just make the diagonal and upper.tri positions Inf?
> > 
> > > dwhich <- function(d) {
> > +      d[row(d) <= col(d)] <- Inf
> > +       which(d == min(d,na.rm=FALSE), arr.ind=TRUE)
> > +  }
> > > dwhich(dm)
> >    row col
> > 10  10   1
> > 
> > --
> > 
> > >> set.seed(42)
> > >> x <- matrix(rnorm(100), 10, 10)
> > >> d <- dist(x)
> > >> dm <- as.matrix(dist(x, diag=TRUE, upper=TRUE))
> > >> dm <- dm[lower.tri(dm)]
> > >> dwhich(d, which(d==min(d)))
> > >  indx row col
> > > 1    9  10   1
> > >> dwhich(dm, which(dm==min(dm)))
> > >  indx row col
> > > 1    9  10   1
> > >
> > >
> > >> -----Original Message-----
> > >> From: r-help-boun...@r-project.org [mailto:r-help-bounces@r-
> > >> project.org] On Behalf Of David Winsemius
> > >> Sent: Friday, January 11, 2013 12:37 PM
> > >> To: eliza botto
> > >> Cc: r-help@r-project.org
> > >> Subject: Re: [R] locating element in distance matrix
> > >>
> > >>
> > >> On Jan 11, 2013, at 9:55 AM, eliza botto wrote:
> > >>
> > >>>
> > >>> Dear useRs,
> > >>> I have a very basic question. I have a distance matrix and i
> > skipped
> > >>> the upper part of it deliberately.
> > >>
> > >> I have no idea what htat means. Code is always helpful in resolving
> > >> ambiguities.
> > >>
> > >>> The distance matrix is 1000*1000.  Then i used "min" command to
> > >>> extract the lowest value from that matrix. Now i want to know what
> > >>> is the location of that lowest element? More precisely, the row and
> > >>> column number of that lowest element.
> > >>> Thanks in advance
> > >>
> > >> ?which
> > >> which( distmat == min(distmat), arr.ind=TRUE)
> > >>
> > >> (It's possible to have more than one match and it would  be up to
> > you
> > >> to decide how to break ties.)
> > >>
> > >> --
> > >>
> > >> David Winsemius, MD
> > >> Alameda, CA, USA
> > >>
> > >> ______________________________________________
> > >> R-help@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.
> > >
> > 
> > David Winsemius
> > Alameda, CA, USA
> 
                                          
        [[alternative HTML version deleted]]

______________________________________________
R-help@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.

Reply via email to