2010-12-02 22 views
2

de voeux,Disposer les éléments d'une matrice selon l'une rowSums + courtes « Appliquer » partie Q

Mon but est de créer une matrice de transition de Markov (probabilité de passer d'un état à un autre) avec le « plus de trafic » de la matrice occupant la section en haut à gauche. Prenons l'exemple suivant:

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) 

Je blême pour réarranger les éléments de cette matrice de telle sorte que les éléments avec les plus grandes sommes rangée sont placés en haut à gauche, dans l'ordre décroissant. Est-ce que ça a du sens? Dans ce cas, l'ordre que je cherche serait B, D, A, E, C Des pensées? En aparté, voici la fonction que j'ai écrite pour construire la matrice de transition. Existe-t-il une manière plus élégante de faire cela qui n'implique pas une double transposition?

TMAT <- apply(t(MAT), 2, function(X) X/sum(X)) 
TMAT <- t(TMAT) 

J'ai essayé les éléments suivants:

TMAT <- apply(MAT, 1, function(X) X/sum(X)) 

Mais ma la fonction personnalisée est encore en train appliqué sur les colonnes du tableau, plutôt que les lignes. Pour un essai de contrôle:

rowSums(TMAT) 
colSums(TMAT) 

sommes en ligne ici doit être égal à 1 ...

Un grand merci à l'avance, Aaron

Répondre

3

Utilisez plus rowSums et colSums!
Le premier problème peut être fait avec simple:

MAT[order(rowSums(MAT),decreasing=T),] 

La seconde avec:

MAT/rep(rowSums(MAT),nrow(MAT)) 

c'est un peu hacky, mais il devient évident si vous vous souvenez de cette matrice est aussi un vecteur par colonne . Prenant le recyclage également en compte, il peut également être fait juste par:

MAT/rowSums(MAT) 
1

Pour votre première demande, cela devient souhaité décroissant réordonnement en sommes rangée:

MAT[rev(order(rowSums(MAT))), ] 

Et cela devient votre TMAT dans un étape. La fonction apply renvoie une série de vecteurs et l'ordre majeur des matrices de la colonne va transposer les résultats de ce que les utilisateurs débutants de R attendent.

> TMAT <- t(apply(MAT, 1, function(X) X/sum(X))) 
> rowSums(TMAT) 
A B C D E 
1 1 1 1 1 
+0

merci beaucoup pour votre aide, tous! ceux-ci ont fait l'affaire. UNE – Aaron