2010-12-02 3 views
2

挨拶によるマトリックスの要素をアレンジ行列は左上のセクションを占めます。次のサンプルを考える:</p> <p>私の目標は、の「最高トラフィック」部分とマルコフ遷移行列(ある状態から別の状態に移動する確率)を作成することで、rowSums +短い「適用」Q

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。これは理にかなっていますか?この場合、私が探している注文はB、D、A、E、Cとなります。

ここでは、遷移行列を構成するために記述した関数を示します。ダブルトランスポーズを伴わないもっとエレガントな方法がありますか?

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

私は次のことを試してみました:

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

しかし、私のカスタム関数は、まだかなりの行より、配列の列の上に塗布なっています。チェック試みについて:ここ

rowSums(TMAT) 
colSums(TMAT) 

行の合計は、事前に1人の...

多くのおかげで、 アーロン

答えて

3

使用rowSumscolSums以上に等しくなければなりません!
第一の問題は、簡単に行うことができますと

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

秒:

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

これは少しハックですが、あなたが行列によっても列ベクトルであることを思い出した場合に明らかになり、 。考慮にリサイクル 取ってはそれもただで行うことができます。

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

をそして、これは一つにあなたのTMATを取得します。あなたの最初のリクエストのために

MAT/rowSums(MAT) 
1

、これは、行の合計が希望降順の並べ替えを取得しますステップ。 apply関数は一連のベクトルを返し、行列の列の主な順序は、Rの最初のユーザーが期待している結果を転置します。

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

ご協力いただきありがとうございます。これらはトリックでした。 A – Aaron

関連する問題