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.

Reply via email to