Try this also: subset(as.data.frame.table(m), !is.na(Freq))
On Fri, Sep 11, 2009 at 1:48 PM, Steve Lianoglou < mailinglist.honey...@gmail.com> wrote: > Hi Jeannine, > > I'm just forwarding this Q&A back to the r-help list, you'll get more eyes > on it and other people might have better solutions. > > Answers inline: > > On Sep 11, 2009, at 12:25 PM, Jeannine Cavender-Bares wrote: > > Dear Steve, >> >> Greetings! You helped me earlier this summer with an R question in >> response to a message Brian McCarthy put out on the listserv. I was >> wondering if you happen to know the answer to the following question or if >> you can explain how I subscribe to the listserv. Can one just send a message >> to r-h...@r-project.org? >> > > You can subscribe to the listserv from here: > > https://stat.ethz.ch/mailman/listinfo/r-help > > Here goes: >> How does one convert a triangular distance matrix into a single column >> distance matrix?: e.g., >> >> traingular: >> A B C >> A na na na >> B 1 na na >> C 0 1 na >> >> single column: >> BA 1 >> CA 0 >> CB 1 >> > > Getting the distances from your matrix is pretty straightforward since > they're all in the lower triangle of the matrix, see: ?lower.tri > > R> m <- matrix(c(NA,1,0,NA,NA,1,NA,NA,NA), 3) > R> dimnames(m) <- list(c('A','B','C'), c('A','B','C')) > R> m[lower.tri(m)] > [1] 1 0 1 > > Getting the names for the distances is a bit more tricky. I'm trying to do > that with the "expand.grid" function, check it out to see how it works: > ?expand.grid > > R> who.vs.who <- expand.grid(rownames(m), rownames(m)) > R> who.vs.who > Var1 Var2 > 1 A A > 2 B A > 3 C A > 4 A B > 5 B B > 6 C B > 7 A C > 8 B C > 9 C C > > We can use the same index generated by ``lower.tri(m)`` to get the names of > the rows vs cols since R stores the elements of a matrix in column major > order[1] (note that when I created the matrix ``m``, I used a vector that > filled a matrix column by column). When you use a single integer to index > into a matrix, it calculates which position to pull out in the same (column > major) order, so: > > * ``m[1]`` is really element m[1,1] > * ``m[2]`` is really element m[2,1], etc ... > > So now: > > R> who.vs.who[lower.tri(m),] > Var1 Var2 > 2 B A > 3 C A > 6 C B > > ... almost there, no just put it together: > > R> dist <- m[lower.tri(m)] > R> who <- who.vs.who[lower.tri(m),] > R> names(dist) <- paste(who[,1], who[,2], sep=".vs.") > R> dist > B.vs.A C.vs.A C.vs.B > 1 0 1 > > HTH, > -steve > > [1] Column major format: > http://en.wikipedia.org/wiki/Row-major_order#Column-major_order > > -- > Steve Lianoglou > Graduate Student: Computational Systems Biology > | Memorial Sloan-Kettering Cancer Center > | Weill Medical College of Cornell University > Contact Info: > http://cbio.mskcc.org/~lianos/contact<http://cbio.mskcc.org/%7Elianos/contact> > > ______________________________________________ > 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. > -- Henrique Dallazuanna Curitiba-Paraná-Brasil 25° 25' 40" S 49° 16' 22" O [[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.