1

bipartiteパッケージで使用する隣接行列を作成しています。各行と列は、2つの異なるクラスのエンティティを表し、最初のクラスのエンティティと2番目のクラスm[i,j]のエンティティ間の相互作用を表します。私は現在、フォームのデータフレームを持っていますijdf

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

ここで、たとえば、行2は、重み4のメンバー188s1と259の間の相互作用を表します。したがって、4である必要があります。ただし、1との間のすべての値が表されるわけではないため、通常のインデックスを使用しても機能しません。可能であれば、次のようなものが必要です。s2m[259,188]max(df$s1, df$s2)

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

列と行の名前を文字ベクトルに変更できることは知っていますが、それをas.character(unique(df$s1))(および同様にs2)に設定してそのようにインデックスを付けるのは非効率的で扱いにくいと思います。また、などの固有の要素のベクトルを保持して使用することも検討しましたs1s2m[which(unique.s2 == i), which(unique.s1 == j)]これも最適ではないソリューションのようです。min(s1)とmax(s1)の間のすべての数値が行列に含まれるわけではないため、次元をc(max(s1)、max(s2))にして、インデックスを直接使用することはできません。

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

4

1 に答える 1

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)。行数や列数を指定しないので、最大値を使用しました。

于 2012-05-04T08:04:22.077 に答える