2012-05-04 19 views
1

bipartiteパッケージで使用する隣接行列を作成しています。各行および列は、2つの異なるクラスのエンティティを表し、m[i,j]は、第1クラスのエンティティiと第2クラスのエンティティとの相互作用を表す。私は現在、例えば、行2はs1の部材188と重量4のs2 259との間の相互作用を表す行列の行と列の名前を数値に変更する

 s1 s2 weight 
1 261 446  1 
2 188 259  4 
3 144 1119  1 

だからm[259,188]ではないので、しかし4でなければならない形式のデータフレームdfを有します1からmax(df$s1, df$s2)までのすべての値が表示されますが、通常のインデックスを使用すると動作しません。私は文字ベクトルに列と行の名前を変更することができます知っているが、私はそれがas.character(unique(df$s1))に設定(とと同様に扱いにくい/非効率的だと思う

 [,144] [,188] [,261] 
[259,]  0  4  0 
[446,]  0  0  1 
[1119,]  1  0  0 

:それは可能であったならば、私はこのような何かをしたいと思いますs2の場合)、そのようにインデックスを作成します。私はまた、s1s2のユニークな要素のベクトルを保持することを検討しました。 m[which(unique.s2 == i), which(unique.s1 == j)]しかし、それは次善の解決策のように思えます。 min(s1)とmax(s1)の間のすべての数値が行列になるわけではないので、単に次元c(max(s1)、max(s2))を作成してインデックスを直接使用することはできません。

私の目標を達成する良い方法はありますか?

+0

あなたはスパース行列のようなものを記述します。私は彼らがRに存在するはずだと思います。 – DrDom

答えて

2

文字として指定されたインデックスとして行と列の名前を使用できます。

最初に、ソートされたインデックスを持つ行列を作成します(s2は、例として行です)。

s1 <- c(261, 188, 144); s2 <- c(446, 259, 1119) 
m <- matrix(0, length(s2), length(s1), dimnames = list(as.character(sort(s2)), as.character(sort(s1)))) 

weight <- c(1, 4, 1) 
m[cbind(as.character(s2), as.character(s1))] <- weight 

    144 188 261 
259 0 4 0 
446 0 0 1 
1119 1 0 0 

m <- matrix(0, 261, 1119) 
x[cbind(s1,s2)] <- weight 

あなたはデフォルト値としてNAではなく、ゼロにしたい場合は、as.numeric(NA)と交換してください。 行数または列数を指定しないので、最大値を使用しただけです。

+0

'bipartite'パッケージ(特に' specieslevel'関数)は、行列を期待し、sparseMatrixオブジェクトを渡すときには動作しません。 –

+0

これで、matrix()を最初に作成し、xでゼロ以外の要素を更新します。[cbind(s1、s2)] = weight – mdsumner

+0

私は答えを変更しました。 – mdsumner

関連する問題