[R] Arrange elements on a matrix according to rowSums + short 'apply' Q
Michael Bedward
michael.bedward at gmail.com
Thu Dec 2 11:01:34 CET 2010
Hi Aaron,
Following up on Ivan's suggestion, if you want the column order to
mirror the row order...
mo <- order(rowSums(MAT), decreasing=TRUE)
MAT2 <- MAT[mo, mo]
Also, you don't need all those extra c() calls when creating
inputData, just the outermost one.
Regarding your second question, your statements...
TMAT <- apply(t(MAT), 2, function(X) X/sum(X))
TMAT <- t(TMAT)
is actually just a complicated way of doing this...
TMAT <- MAT / rowSums(MAT)
You can confirm that by doing it your way and then this...
TMAT == MAT / rowSums(MAT)
...and you should see a matrix of TRUE values
Michael
On 2 December 2010 20:43, Ivan Calandra <ivan.calandra at uni-hamburg.de> wrote:
> Hi,
>
> Here is a not so easy way to do your first step, but it works:
> MAT2 <- cbind(MAT, rowSums(MAT))
> MAT[order(MAT2[,6], decreasing=TRUE),]
>
> For the second, I don't know!
>
> HTH,
> Ivan
>
>
> Le 12/2/2010 09:46, Aaron Polhamus a écrit :
>>
>> Greetings,
>>
>> My goal is to create a Markov transition matrix (probability of moving
>> from
>> one state to another) with the 'highest traffic' portion of the matrix
>> occupying the top-left section. Consider the following sample:
>>
>> inputData<- c(
>> c(5, 3, 1, 6, 7),
>> c(9, 7, 3, 10, 11),
>> c(1, 2, 3, 4, 5),
>> c(2, 4, 6, 8, 10),
>> c(9, 5, 2, 1, 1)
>> )
>>
>> MAT<- matrix(inputData, nrow = 5, ncol = 5, byrow = TRUE)
>> colnames(MAT)<- c("A", "B", "C", "D", "E")
>> rownames(MAT)<- c("A", "B", "C", "D", "E")
>>
>> rowSums(MAT)
>>
>> I wan to re-arrange the elements of this matrix such that the elements
>> with
>> the largest row sums are placed to the top-left, in descending order. Does
>> this make sense? In this case the order I'm looking for would be B, D, A,
>> E,
>> C Any thoughts?
>>
>> As an aside, here is the function I've written to construct the transition
>> matrix. Is there a more elegant way to do this that doesn't involve a
>> double
>> transpose?
>>
>> TMAT<- apply(t(MAT), 2, function(X) X/sum(X))
>> TMAT<- t(TMAT)
>>
>> I tried the following:
>>
>> TMAT<- apply(MAT, 1, function(X) X/sum(X))
>>
>> But my the custom function is still getting applied over the columns of
>> the
>> array, rather than the rows. For a check try:
>>
>> rowSums(TMAT)
>> colSums(TMAT)
>>
>> Row sums here should equal 1...
>>
>> Many thanks in advance,
>> Aaron
>>
>> [[alternative HTML version deleted]]
>>
>> ______________________________________________
>> 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.
>>
>
> --
> Ivan CALANDRA
> PhD Student
> University of Hamburg
> Biozentrum Grindel und Zoologisches Museum
> Abt. Säugetiere
> Martin-Luther-King-Platz 3
> D-20146 Hamburg, GERMANY
> +49(0)40 42838 6231
> ivan.calandra at uni-hamburg.de
>
> **********
> http://www.for771.uni-bonn.de
> http://webapp5.rrz.uni-hamburg.de/mammals/eng/1525_8_1.php
>
> ______________________________________________
> 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.
>
More information about the R-help
mailing list