Aaron Polhamus
2010-Dec-02 08:46 UTC
[R] Arrange elements on a matrix according to rowSums + short 'apply' Q
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]]
Ivan Calandra
2010-Dec-02 09:43 UTC
[R] Arrange elements on a matrix according to rowSums + short 'apply' Q
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 > stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide 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 ********** for771.uni-bonn.de webapp5.rrz.uni-hamburg.de/mammals/eng/1525_8_1.php